Java中List泛型Map根据某一个key去重,保留一个数据。利用jdk8stream()流实现去重

前言

在现实开发中关于数据展示可能需要对数据进行一些处理,比如去重。在查询以及相关接口调用后,我们会得到一个list<Map>的结果集,需要将里面的数据进行处理后展示。之前写过利用collections.sort去重,本篇文章介绍利用stream流对数据进行去重展示。

先看下面demo

在这里插入图片描述

看控制台打印如下:
在这里插入图片描述

可以看见有两个三年级1班的数据,下面,利用stream()流处理list数据:
先封装公共方法:
在这里插入图片描述
而后调用:
在这里插入图片描述
查看控制台数据:
在这里插入图片描述
可以看见,数据已经处理成功,同理,List<DTO>也是一个用法,下面贴出代码:

package com.jsjn.skylark.service.service.wechat.xxw;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
 * @author zym
 * @date: 2020/6/23 14:16
 */
public class TestDistinct {
    /**
     * 去重结构
     * @param keyExtractor
     * @param <T>
     * @return
     */
    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

    public static void main(String[] args) {
        Map hashMap1 = new HashMap<>();
        hashMap1.put("class","三年级1班");
        hashMap1.put("age",18);
        hashMap1.put("name","小张");
        Map hashMap2 = new HashMap<>();
        hashMap2.put("class","三年级1班");
        hashMap2.put("age",18);
        hashMap2.put("name","小李");
        Map hashMap3 = new HashMap<>();
        hashMap3.put("class","三年级2班");
        hashMap3.put("age",18);
        hashMap3.put("name","小红");
        Map hashMap4 = new HashMap<>();
        hashMap4.put("class","三年级3班");
        hashMap4.put("age",18);
        hashMap4.put("name","小白");
        List<Map> list=new ArrayList<>();
        list.add(hashMap1);
        list.add(hashMap2);
        list.add(hashMap3);
        list.add(hashMap4);
        System.out.println("根据班级名称去重前:");
        for (Map map:list){
            System.out.println(map.get("class"));
        }
        List<Map> list1 = list.stream()
                .filter(distinctByKey(o -> o.get("class")))
                .collect(Collectors.toList());

        System.out.println("******************************************");
        System.out.println("按照班级名称去重后");
        for (Map map:list1){
            System.out.println(map.get("class"));
        }
    }
}

欢迎交流。

猜你喜欢

转载自blog.csdn.net/goGoing_/article/details/106923289