Удалить элементы из списка объектов путем сравнения с другим массивом в Java

#java #list

#java #Список

Вопрос:

У меня есть список подписок

 subscriptions = [
      { 
        code : "Heloo",
        value:"some value",
        reason : "some reason"
      },
      { 
        code : "Byeee",
        value:"some byee",
        reason : "some byee"
      },
      { 
        code : "World",
        value:"some World",
        reason : "some world"
      }
    ]
  

У меня есть другой список отписок:

 unsubscribe : ["Heloo","World"]
  

Я хочу отменить подписку на элементы в подписках, сравнивая эти два массива

Конечный результат :

 subscriptions = [
  { 
    code : "Byeee",
    value:"some byee value",
    reason : "some byee reason"
  }
]
  

Ниже приведено мое решение :

 List<String> newList = new ArrayList<>();
for (String products : subscriptions) {
        newList.add(products.code);
 }

if (!newList.containsAll(unsubscribe) {
        log.error("Few products are not subscribed");  
}

for (int i = 0; i < subscriptions.size(); i  ) {
        if(unsubscribe.contains(subscriptions.get(i).code)) {
          subscriptions.remove(i);
        }
}
  

Это могло бы быть лучше. Я ищу лучшее / оптимизированное решение.

Комментарии:

1. Это читаемо и работает. Сколько подписок вам нужно обработать, чтобы, по вашему мнению, вам нужно что-то более оптимизированное?

2. Вы могли бы попробовать removeIf(...)

3. @VishwaRatna Прежде всего, пожалуйста, успокойтесь. Во-вторых, OP не спрашивал ни об одном из них в частности. Это в ответах, а не в вопросе. Кроме того, в вопросе используются обобщения. Должны ли мы также добавить тег java-5?

4. @Federico klez Culloca: Я создал массив new list только из кодов, чтобы проверить, содержит ли newList все элементы для отмены подписки. Можно ли это сделать лучшим способом вместо создания нового списка?

Ответ №1:

Использование removeIf значительно очистит ваш код:

 List<Subscription> subscriptions =  ... ;
List<String> unsubscribe = ...;

subscriptions.removeIf(s -> unsubscribe.contains(s.code));
  

Ответ №2:

Вы также можете сделать это с помощью streams:

 List<String> newList = subscriptions
                                 .stream()
                                 .filter(it -> !unsubscribe.contains(it.code))
                                 .collect(Collectors.toList());