Вы не можете сделать это с вашим текущим подходом, вместо этого вы можете использовать toMap
сборщик:
Stream.concat(collection1.stream(), collection2.stream())
.collect(Collectors.toMap(Function.identity(),Function.identity(),
(left, right) -> {
left.setCount(left.getCount() + right.getCount());
return left;
})).values()
.stream()
.sorted(Comparator.comparingInt(A::getCount))
.collect(Collectors.toList());
Используется Stream.concat для объединения collection1
и collection2
в один Stream<A>
.
Затем мы вызываем коллектор toMap , где первый Function.identity () выбирает элементы источника в качестве ключей, т. Е. A
и вторая Function. identity () также выбирает элементы источника в качестве значений; снова A
, поэтому на данный момент вы можете визуализировать данные как Map<A, A>
.
Функция (left, right) -> { ... }
известна как функция слияния, это место, где, если два заданных объекта равны, мы тогда скажем взять счетчик первого элемента и взять счетчик второго элемента, сложить их вместе и присвоить новое значение возвращается к одному из элементов, которые мы собираемся сохранить, а затем отбросить другой.
, поскольку вы переопределили equals
и hashcode
, нам не нужно явно вызывать его, вместо этого метод equals
будет вызываться неявно для определить, равны ли два заданных объекта.
как только мы собрали элементы в Map<A, A>
, мы затем вызываем метод values()
для извлечения Collection<A>
, что затем позволяет нам создать поток из него с помощью метода stream()
и дополнительно включает нам нужно отсортировать элементы потоков с помощью отсортированного метода и, наконец, собрать его в List<A>
с помощью сборщика toList .