使用stream流过滤对象中相同的属性值

使用stream流过滤对象中相同的属性值


文章目录


前言

我们在开发项目中,有很多需求是需要集合根据某个属性筛选出重复的数据,这里我写一个实例。


一、使用stream流过滤集合对象中相同属性

1.创建一个实体类

java 复制代码
package com.gcl.streams.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    /**
     * 主键
     */
    private String id;
    /**
     * 学生号
     */
    private String stuNum;
    /**
     * 姓名
     */
    private String name;
}

2.创建一个过滤工具类

java 复制代码
package com.gcl.streams.utils;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;

public class StreamUtil {

    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor){
        Set<Object> seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }
}

3.创建一个测试类

java 复制代码
package com.gcl.streams;

import com.gcl.streams.entity.Student;
import com.gcl.streams.utils.StreamUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {
        Student student1 = new Student("1", "No1", "小王");
        Student student2 = new Student("2", "No2", "小郭");
        Student student3 = new Student("3", "No2", "小高");
        List<Student> studentList = new ArrayList<>();
        studentList.add(student1);
        studentList.add(student2);
        studentList.add(student3);
        System.out.println(studentList);
        //根据学号过滤
        List<Student> list = studentList.stream().filter(StreamUtil.distinctByKey(Student::getStuNum)).collect(Collectors.toList());
        System.out.println(list);
    }
}

结果:

代码如下(示例):[Student(id=1, stuNum=No1, name=小王), Student(id=2, stuNum=No2, name=小郭), Student(id=3, stuNum=No2, name=小高)]

Student(id=1, stuNum=No1, name=小王), Student(id=2, stuNum=No2, name=小郭)


总结

以上就是今天要讲的内容,本文仅仅简单介绍了stream过滤对象相同属性的使用,而Stream提供了大量的方法,可以看我的这个博客:http://t.csdnimg.cn/ARCK6

相关推荐
开心香辣派小星40 分钟前
23种设计模式-15解释器模式
java·设计模式·解释器模式
Halo_tjn1 小时前
虚拟机相关实验概述
java·开发语言·windows·计算机
RainbowSea1 小时前
github 仓库主页美化定制
后端
摆烂z1 小时前
Docker与Jib(maven插件版)实战
java
RainbowSea1 小时前
从 Spring Boot 2.x 到 3.5.x + JDK21:一次完整的生产环境迁移实战
java·spring boot·后端
笨手笨脚の1 小时前
Spring Core常见错误及解决方案
java·后端·spring
奶油松果2 小时前
Springboot自动装配 - redis和redission
java·spring boot·redis
计算机毕设匠心工作室2 小时前
【python大数据毕设实战】全球大学排名数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
霍夫曼2 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
VX:Fegn08952 小时前
计算机毕业设计|基于Java人力资源管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·课程设计