使用stream流根据对象属性对复杂list对象去重

日常开发中,我们可能会遇到这样一种情况,需要对数据库查询出来的数据进行一个二次处理,从而达到我们需要的数据结构。stream流正是java8提供的对复杂list操作方便工具。

我们先介绍如何使用stream流根据对象属性对复杂list对象去重,再介绍一下stream流最常用的一些操作:

使用stream流根据对象属性对复杂list对象去重

例子1

实体类:

java 复制代码
import lombok.Data;

@Data
public class SyncUserDto {

    private String id;
    private String name;
    private String code;
    private String departmentCode;
    private String departmentName;
    private String position;
    private String phone;
    private String mobile;
    private String email;
    private Integer sex;
    private String idcard;
    private Integer status;
    private String account;
    private String weighting;
    private String photourl;
    private String openid;
    private String userid;
}

去重操作:

java 复制代码
            //去重
             ArrayList<SyncUserDto> collect = syncUserDtos.stream().collect(Collectors.collectingAndThen(
                    Collectors.toCollection(
                            () -> new TreeSet<>((o1, o2) -> {
                                if (o1.getAccount().compareTo(o2.getAccount()) == 0) {
                                    return 0;
                                } else {
                                    return o1.getAccount().compareTo(o2.getAccount());
                                }
                            }))
                    , ArrayList::new)
            );

例子2

实体类:

java 复制代码
public class User {
	
	private String id;
	private String name;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public User(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
}

去重:

java 复制代码
public class Demo {
    public static void main(String[] args) {
    	
        List<User> list = new ArrayList<>();
        User u1 = new User("a", "aaa");
        User u2 = new User("a", "aaa");
        User u3 = new User("b", "aaa");
        User u4 = new User("a", "b");
        User u5 = new User("b", "a");

        list.add(u1);
        list.add(u2);
        list.add(u3);
        list.add(u4);
        list.add(u5);
        list.add(u1);
        list.add(u2);
        list.add(u3);
        list.add(u4);
        list.add(u5);
        List<User> unique=list.stream().collect(Collectors.collectingAndThen(
        		Collectors.toCollection(
        				()->new TreeSet<>((o1,o2)->{
        					  if (o1.getName().compareTo(o2.getName()) == 0) {
        		                    return 0;
        		                } else {
        		                    return o1.getName().compareTo(o2.getName());
        		                }
        				}))
        				, ArrayList::new)
        		);
       

        System.out.println("根据对象属性name进行去重");
        System.out.println("----------	去重前----------");
        System.out.println("集合中元素的个数为:"+list.size());
        for (User user : list) {
            System.out.println(user.toString()+"--姓名:"+user.getName());
        }
        System.out.println("-----------去重后----------");
         System.out.println("集合中元素的个数为:"+unique.size());
        for (User user : unique) {
            System.out.println(user.toString()+"--姓名:"+user.getName());
        }
    }
}

stream流常用操作

forEach():遍历流中的对象

java 复制代码
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("李四");
        list.add("李四");
        list.add("李四");
        list.add("李四");
        list.add("李四");
 
        //遍历流的对象
        list.stream().forEach((name) -> System.out.println(name));
    }
 

filter():filter对流对象进行过滤

java 复制代码
 
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四二");
        list.add("李四我");
        list.add("李四去晚");
        list.add("李四请问");
        list.add("李四去");
        list.add("李四我");
 
        //过滤流的对象
        list.stream().filter((name) -> name.length()==2);
    }
 

map():map()是对集合中的对象进行映射的,将对象从一种类型转换成另一种类型

java 复制代码
 
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
 
        //map()是对集合中的对象进行映射的,将对象从一种类型转换成另一种类型
        list.stream().map(num -> Integer.parseInt(num));
    }
 
}

count():count是对流数据统计的方法,但是count之后返回的是long类型,所以无法再进行流操作。

java 复制代码
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
 
        //count()对流数据进行统计
        System.out.println(list.stream().count());
    }
 
}

limit():选取流数据的前多少条数据

java 复制代码
 
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("李四1");
        list.add("李四2");
        list.add("李四3");
        list.add("李四4");
        list.add("李四5");
        list.add("李四6");
        list.add("李四7");
        //limit() 选取流数据的前多少条数据
        list.stream().limit(2);
    }
}

skip():跳过流数据的前多少条数据,该方法与limit()方法刚好相反

java 复制代码
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("李四1");
        list.add("李四2");
        list.add("李四3");
        list.add("李四4");
        list.add("李四5");
        list.add("李四6");
        list.add("李四7");
        //skip() 跳过流数据的前多少条数据
        list.stream().skip(2);
    }
}

concat():Stream的静态方法concat()实现对两个流数据进行合并

java 复制代码
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("李四1");
        list.add("李四2");
        list.add("李四3");
        list.add("李四4");
        list.add("李四5");
        list.add("李四6");
        list.add("李四7");
        // 定义一个集合
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("1");
        list1.add("2");
        list1.add("3");
        list1.add("4");
        list1.add("5");
        list1.add("6");
        list1.add("7");
        //concat()实现对两个流数据进行合并
        Stream.concat(list.stream(),list1.stream());
    }
 
}
相关推荐
_Aaron___1 小时前
Spring AI 接入 MCP:工具调用不是“能调就行”,关键是边界治理
java·人工智能·spring
向量引擎1 小时前
从零起步,如何打造专属向量引擎 API 中转工作流?
java·服务器·前端
LJianK11 小时前
普通接口,用到getter和setter方法的地方,jackson转换
java
辰海Coding1 小时前
MiniSpring框架学习-分解 Dispatcher
java·学习·spring·架构
初夏睡觉1 小时前
数据结构学习之~二叉堆 (P3378 【模版】堆)
数据结构·c++·学习
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第84题】【Mysql篇】第14题:为什么用 InnoDB 存储引擎的表建议用整型的自增主键?
java·开发语言·数据库·mysql·面试
小江的记录本1 小时前
【JVM虚拟机】JVM调优:常用JVM参数、调优核心指标、OOM排查、GC日志分析、Arthas工具使用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
金銀銅鐵1 小时前
[Java] 用图形化界面演示 iadd, isub, iconst_<i> 指令的效果
java·后端·python
云泽8082 小时前
笔试算法 - 链表篇(一):移除、反转、合并、回文判断全解析
数据结构·c++·算法·链表
J2虾虾2 小时前
Spring AI Alibaba文档
java·人工智能·spring