Единственное, что вы можете сделать для улучшения производительности, это использовать Set
с вместо List
с, потому что они имеют O (1) для Set.contains()
. Но поэтому вы не должны заботиться о дубликатах в ваших списках.
Если вы не заботитесь о порядке товаров, используйте HashSet
, в противном случае используйте LinkedHashSet
. При использовании наборов почти не имеет значения, используете ли вы Set.removeAll()
или Stream.filter()
, потому что removeAll()
использует contains()
внутри.
Так что вы можете использовать это, если вам нужен новый набор и не хотите прикасаться к оригиналу:
Set<String> set2 = new HashSet<>(list2);
Set<String> unavailable = list1.stream()
.filter(e -> !set2.contains(e))
.collect(Collectors.toSet());
Если вы хотите получить список как результат, используйте Collectors.toList()
вместо:
Set<String> set2 = new HashSet<>(list2);
List<String> unavailable = list1.stream()
.filter(e -> !set2.contains(e))
.collect(Collectors.toList());
Используйте это, если вы просто хотите удалить элементы из list1
:
Set<String> set2 = new HashSet<>(list2);
list1.removeAll(set2);
или еще короче:
list1.removeAll(new HashSet<>(list2));