gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:49:38 27 4
gpt4 key购买 nike

我有一个类(class) String和一个 int field 。

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>如果我想创建一个 map (分组)来了解每个名称的最大值的 Data 对象,我可以这样做,
Map<String, Optional<Data>> result = list.stream()
.collect(Collectors.groupingBy(Data::getName,
Collectors.maxBy(Comparator.comparing(Data::getValue))));
但是,由于 Collectors.maxBy 的约定,RHS 被包裹在一个 Optional 中。但我想要一个 Map<String, Data> .
我能想到的一种选择是使用 Collectors.collectingAndThen ,但我将不得不创建一个不必要的中间 map 。
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()))));
是否有使用流的惯用方法来实现这一目标?

最佳答案

您可以使用 BinaryOperator.maxByCollectors.toMap

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

关于java - 将收集器 maxBy 与 groupingBy 一起使用时展开可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63159338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com