使用Stream流对List中的Map进行多条件去重

时间:2025-03-20 07:58:09

使用Java8的流可以很方便的对List进行多种操作,如分组、去重、过滤等,本文分享如何根据List中Map的多个条件进行去重。

首先,创建一个测试用的List:

List<Map<String, String>> list = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
("id", "id1");
("name", "name1");
("age", "22");
(new HashMap<>(map));
("id", "id1");
("name", "name1");
("age", "22");
(new HashMap<>(map));
("id", "id1");
("name", "name2");
("age", "22");
(new HashMap<>(map));
("id", "id2");
("name", "name2");
("age", "32");
(new HashMap<>(map));

然后根据Map中的id和name字段进行去重:

list = ()
        .collect((
                (() ->
                        new TreeSet<>(((o)-> ("id") + ";" + ("name")))), ArrayList::new));

去重前和去重后的结果对比:

去重前:[{name=name1, id=id1, age=22}, {name=name1, id=id1, age=22}, {name=name2, id=id1, age=22}, {name=test, id=id2, age=32}]
去重后:[{name=name1, id=id1, age=22}, {name=name2, id=id1, age=22}, {name=name2, id=id2, age=32}]

3、List的某个字段为String,对其求和:

防止精度丢失:用BigDecimal
​​​​​​​//字段为String类型,数字带小数,防止精度丢失:用BigDecimal String aaa = ().map(i -> new BigDecimal(())).reduce(, BigDecimal::add).toString(); ("aaa:"+ aaa); //会精度丢失 String bbb = (().mapToDouble(i -> (())).sum()); ("bbb:"+ bbb);