使用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);