开发者社区> 问答> 正文

Java Stream按一个属性分组,并通过另一个属性收集max元素

我想知道流(或收集器)中是否已经有一个实现的功能,该功能首先按属性对流进行分组,然后返回按另一个属性排序的列表中的第一个元素。例如,以下代码尝试使用第一个属性对对象流进行分组,然后想要收集具有第二个属性的最高值的对象。

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.

我使用简单的for循环的代码是:

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);
               }
        }
  }

任何帮助都感激不尽。 问题来源:Stack Overflow

展开
收起
montos 2020-03-25 23:02:39 1158 0
1 条回答
写回答
取消 提交回答
  • 使用带有合并功能的toMap在第二个属性上找到max元素

    Map<String, MyClass> map = myClassList.stream()
            .collect(Collectors.toMap(MyClass::getAtt1, Function.identity(),
                    BinaryOperator.maxBy(Comparator.comparing(MyClass::getAtt2))));
    

    回答来源:Stack Overflow

    2020-03-25 23:03:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载