使用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());
    }
 
}
相关推荐
面朝大海,春不暖,花不开几秒前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y1 分钟前
Java安全点safepoint
java
夜晚回家36 分钟前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java
白宇横流学长1 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
fat house cat_2 小时前
【redis】线程IO模型
java·redis
思捻如枫2 小时前
C++数据结构和算法代码模板总结——算法部分
数据结构·c++
小猫咪怎么会有坏心思呢2 小时前
华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)
数据结构·链表·华为od