我有一个带有 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)
是否有使用流的惯用方法来实现这一点?
你可以用BinaryOperator.maxBy与Collectors.toMap
Map<String, Data> result = list.stream()
.collect(Collectors.toMap(Data::getName, Function.identity(),
BinaryOperator.maxBy(Comparator.comparing(Data::getValue))));
Run Code Online (Sandbox Code Playgroud)