как объединить две коллекции, обновив значение для дубликатов - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть этот класс:

class A{
 int count=0;


 //equals and hashCode implemented
}

создать две коллекции:

Collection<A>  collection1;//something
Collection<A>  collection2;//something

объединить коллекции:

Stream.concat(collection1.stream(), collection2.stream())
                //do something here???
                .distinct()
                .sorted(new Comparator<A>() {
                  @Override
                  public int compare(A o1, A o2) {

                     return new Integer(o1.count).compareTo(new Integer(o2.count));
                  }
                })
                .collect(Collectors.toList());

Я хочу объединить эти два списка, и если есть дубликаты, я хочу обновить целое число count;, приведенный выше код полностью избавится от дубликатов

Например, скажем, мы получили объект в collection1 и collection2, равный (o1.equals(o2) == true). Один имеет count=10, а другой - count=20 Я хочу иметь коллекцию различных объектов с этим объектом, чтобы иметь count=30

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 27 апреля 2018

Вы не можете сделать это с вашим текущим подходом, вместо этого вы можете использовать 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...