Java Группировка потоков по одному атрибуту и ​​сбор максимального элемента по другому атрибуту - PullRequest
6 голосов
/ 14 марта 2020

Мне интересно, существует ли уже реализованная функция в потоках (или коллекторах), которая сначала группирует поток по атрибуту, а затем возвращает первый элемент в списке, отсортированный по другому атрибуту. Например, следующий код пытается сгруппировать поток объектов, используя первый атрибут, а затем хочет собрать тот объект, который имеет наибольшее значение второго атрибута.

class MyClass{
 String att1;
 String att2;
}

Теперь я хочу добиться чего-то подобного с Stream myClassStream -

Map<String,MyClass> myMap = myClassStream().collect(Collectors.groupingBy(MyClass::getAtt1)); //Now I want to do Sorting after grouping to collect only the element which has the highest value of attr2.

Мой код, использующий simple для l oop:

Map<String, MyClass> postAnalyticsMap = new HashMap<>();
for (MyClass post : myClassList) {
      if (post.get(post.getAtt1()) == null) {
               post.put(post.getAtt1(), post);
      } else {
               MyClass existingClass = postAnalyticsMap.get(post.getAtt1());
               if (existingPostAnalytics.getAtt2() < post.getAtt2()) {
                    postAnalyticsMap.put(post.getAtt1(), post);
               }
        }
  }

Любая помощь будет высоко ценится.

Ответы [ 2 ]

5 голосов
/ 14 марта 2020

Используйте toMap с функцией слияния, чтобы найти элемент max по второму атрибуту

Map<String, MyClass> map = myClassList.stream()
        .collect(Collectors.toMap(MyClass::getAtt1, Function.identity(),
                BinaryOperator.maxBy(Comparator.comparing(MyClass::getAtt2))));
2 голосов
/ 14 марта 2020

Вы можете сделать что-то вроде этого:

myClassStream()
     .collect(Collectors.groupingBy(MyClass::getAtt1,
            Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(MyClass::getAtt2)),
                            myClass -> myClass.map(MyClass::getAtt2).orElse(""))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...