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

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

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

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

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

list = list.stream()
        .collect(Collectors.collectingAndThen(
                Collectors.toCollection(() ->
                        new TreeSet<>(Comparator.comparing((o)-> o.get("id") + ";" + o.get("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 = list.stream().map(i -> new BigDecimal(i.getCurrentIncome())).reduce(BigDecimal.ZERO, BigDecimal::add).toString(); System.out.println("aaa:"+ aaa); //会精度丢失 String bbb = String.valueOf(list.stream().mapToDouble(i -> Double.parseDouble(i.getCurrentIncome())).sum()); System.out.println("bbb:"+ bbb);

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java 8及以上版本,可以使用Stream流的distinct()方法对集合进行去重操作。如果要根据多个字段进行去重,可以使用Stream流的map()方法和collect()方法,结合lambda表达式进行处理。 以下是示例代码: ```java public class Person { private String name; private int age; private String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } // 省略getter和setter方法 @Override public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) { return false; } Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name) && Objects.equals(gender, person.gender); } @Override public int hashCode() { return Objects.hash(name, age, gender); } } List<Person> personList = new ArrayList<>(); personList.add(new Person("Tom", 20, "male")); personList.add(new Person("Jerry", 22, "male")); personList.add(new Person("Lily", 20, "female")); personList.add(new Person("Tom", 20, "male")); personList.add(new Person("Lily", 20, "female")); List<Person> uniquePersonList = personList.stream() .map(person -> new Person(person.getName(), person.getAge(), person.getGender())) .distinct() .collect(Collectors.toList()); System.out.println(uniquePersonList); ``` 在上面的示例代码,我们定义了一个Person类,并创建了一个包含多个Person对象的列表personList。我们在Person类实现了`equals()`和`hashCode()`方法,用于指定去重的关键字,即按照name、age、gender属性进行去重。 我们使用Stream流的map()方法将Person对象转换为新的Person对象,这样可以避免在去重时修改原有的对象。然后使用distinct()方法进行去重操作,并将结果存储在uniquePersonList。 最后输出去重后的Person对象列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值