java - JDK8 lambda 过滤器从列表到其他列表

标签 java lambda

我想要一个 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/

相关文章:

java - 如何在 IntelliJ 中使用 Java 11 目标 Java 1.8 进行编译

java - Lambda 表达式可以解决死锁吗?

python - 使用 lambda 打印斐波那契数列并在 python 中映射或减少

lambda - (self self) 在 let 语句中调用,用严格的语言

c# - Linq to SQL .Any() 有多个条件?

java - Recycleviewer - 如何重用布局?

java - MySql 更新错误 Java

c# - 在 WPF 按钮单击事件上使用 lambda 表达式时出现奇怪的行为

java - 在文本文件中存储随机数 (Java)

java - J2me Player,一个接一个播放MP3文件