#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());