您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

流-按属性和最大值收集

流-按属性和最大值收集

List当您可以首先收集最大元素时,请勿收集到中,而只是提取一个值,例如

Map<String,Match> result =
    Stream.of(new Match("A", 1), new Match("A", 2), new Match("A", 4), new Match("A", 10),
              new Match("B", 3), new Match("B", 6), new Match("B", 12), new Match("C", 1))
        .collect(Collectors.groupingBy(Match::getType, Collectors.collectingAndThen(
            Collectors.reducing(BinaryOperator.maxBy(
                                    Comparator.comparingInt(Match::getscore))),
            Optional::get)));

但是,每当您需要Optional在的上下文中提取groupingBy,都值得检查是否具有合并功能的toMap`是否可以给出更简单的结果:

Map<String,Match> result =
    Stream.of(new Match("A", 1), new Match("A", 2), new Match("A", 4), new Match("A", 10),
              new Match("B", 3), new Match("B", 6), new Match("B", 12), new Match("C", 1))
        .collect(Collectors.toMap(Match::getType, Function.identity(),
                 BinaryOperator.maxBy(Comparator.comparingInt(Match::getscore))));

一旦有了,Map您可以通过以下方式产生所需的输出

result.values().forEach(m -> System.out.println(m.getType() + ": " + m.getscore()));

但是,如果您不需要实际的Match实例,则可以做得更简单:

Stream.of(new Match("A", 1), new Match("A", 2), new Match("A", 4), new Match("A", 10),
          new Match("B", 3), new Match("B", 6), new Match("B", 12), new Match("C", 1))
    .collect(Collectors.toMap(Match::getType, Match::getscore, Math::max))
    .forEach((type,score) -> System.out.println(type + ": " + score));
其他 2022/1/1 18:33:09 有549人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶