将收集器 maxBy 与 groupingBy 一起使用时展开可选

use*_*er7 4 java java-stream

我有一个带有 aString和一个int字段的类。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,由于合同的原因,RHS 被包裹在一个 Optional 中,Collectors.maxBy但我想要一个Map<String, Data>.

我可以想到使用的一种选择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()))));
Run Code Online (Sandbox Code Playgroud)

是否有使用流的惯用方法来实现这一点?