我想要一个 List<Pojo>
至其他List<Pojo>
输入如下数据:
Pojo -> type:A money:20.00
Pojo -> type:A money:10.00
Pojo -> type:B money:23.00
Pojo -> type:A money:11.00
Pojo -> type:C money:38.00
Pojo -> type:B money:233.00
并输出如下数据(每种类型最大的钱):
Pojo -> type:A money:20.00
Pojo -> type:B money:233.00
Pojo -> type:C money:38.00
那么,我如何使用 lambda 来完成这项工作?
提前致谢!
最佳答案
这是一种使用 max by 的方法
public class Test4 {
public static void main(String[] args) {
List<Pojo> pojoList = new ArrayList<>();
pojoList.add(new Pojo("A", 20.00d));
pojoList.add(new Pojo("A", 10.00d));
pojoList.add(new Pojo("B", 23.00d));
pojoList.add(new Pojo("A", 11.00d));
pojoList.add(new Pojo("C", 38.00d));
pojoList.add(new Pojo("B", 233.00d));
Map<String, Optional<Pojo>> map = pojoList.stream()
.collect(Collectors.groupingBy(Pojo::getType, Collectors.maxBy(Comparator.comparing(Pojo::getMoney))));
List<Pojo> pojos = map.values().stream().map(Optional::get).collect(Collectors.toList());
System.out.println(pojos);
}
static class Pojo {
public String type;
public double money;
public Pojo(String type, double money) {
this.type = type;
this.money = money;
}
public double getMoney() {
return money;
}
public String getType() {
return type;
}
@Override
public String toString() {
return "Pojo [type=" + type + ", money=" + money + "]";
}
}
}
输出
[Pojo [type=A, money=20.0], Pojo [type=B, money=233.0], Pojo [type=C, money=38.0]]
更新
有 Collectors.collectingAndThen
可用于对结果应用函数,以获取由 Optional
包装的值
导入
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.maxBy;
收集然后然后
Map<String, Pojo> result = pojoList.stream()
.collect(groupingBy(Pojo::getType, collectingAndThen(maxBy(comparing(Pojo::getMoney)), Optional::get)));
输出
{A=Pojo [type=A, money=20.0], B=Pojo [type=B, money=233.0], C=Pojo [type=C, money=38.0]}
关于java - JDK8 lambda 过滤器从列表到其他列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39136457/