【问题标题】:Unwrap Optional when using Collectors maxBy with groupingBy将 Collectors maxBy 与 groupingBy 一起使用时展开可选
【发布时间】:2020-07-29 17:35:00
【问题描述】:

我有一个带有Stringint 字段的类。

public class Data {
    private String name;
    private int value;

    private Data(String name, int value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public int getValue() {
        return value;
    }
}

我有一个List<Data>,如果我想创建一个地图(分组)来了解每个 name最大值 的 Data 对象,我可以这样做,

Map<String, Optional<Data>> result = list.stream()
            .collect(Collectors.groupingBy(Data::getName,
                    Collectors.maxBy(Comparator.comparing(Data::getValue))));

但是,由于Collectors.maxBy 的合同,RHS 包含在 Optional 中,但我想要 Map&lt;String, Data&gt;

我可以想到一个选项使用Collectors.collectingAndThen,但我将不得不创建一个不必要的中间映射。

list.stream()
         .collect(Collectors.collectingAndThen(Collectors.groupingBy(Data::getName,
                Collectors.maxBy(Comparator.comparing(Data::getValue))),
                map -> map.entrySet().stream()
                        .collect(Collectors.toMap(Map.Entry::getKey,
                                 e -> e.getValue().get()))));

有没有一种惯用的方式来使用流来实现这一点?

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    您可以将BinaryOperator.maxByCollectors.toMap 一起使用

    Map<String, Data> result = list.stream()
            .collect(Collectors.toMap(Data::getName, Function.identity(),
                BinaryOperator.maxBy(Comparator.comparing(Data::getValue))));
    

    【讨论】:

    • 够简单..我只是错过了。
    • @Nikolas 我相信确实如此。你发现问题了吗?
    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2017-04-11
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多