Java8 list多属性去重

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。

在 Java 开发中,我们经常会面临对 List 中的对象属性去重的需求。然而,当需要根据多个属性来进行去重时,情况会稍微复杂一些。本篇博客将深入探讨如何使用 Java 8 的 Stream API 来实现 List 多属性去重。

前言

在实际开发中,我们常常遇到一个业务场景:有一个 List 集合,其中包含了多个对象,需要根据对象中某个或者某些属性来进行去重操作,以确保 List 中的元素在这些属性的组合下唯一。在 Java 8 中,Stream API 为我我们提供了一些便捷的操作,使得在开发中,效率有所提升。

list 多属性去重

创建一个 RequestDto 类,包含了姓名(name)、 id(主键)、状态(status)三个属性。我们的目标是根据姓名、id和状态这三个属性来对List 进行去重操作。

RequestDto 类:

java 复制代码
@Data
public class RequestDto {
    private String name; // 姓名
    private String id; // id
    private String status; // 状态
}

使用stream Api 进行去重,我们先创建一些对象集合:

java 复制代码
package com.yin.demo.controller;

import lombok.Data;

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


@Data
public class RequestDto {
    private String name;
    private String id;
    private String status;
}

class demo {
    public static void main(String[] args) {
        List<RequestDto> li = new ArrayList<>();
        RequestDto dto1 = new RequestDto();
        dto1.setId("1");
        dto1.setName("张三");
        dto1.setStatus("1");
        li.add(dto1);

        RequestDto dto2 = new RequestDto();
        dto2.setId("1");
        dto2.setName("张三");
        dto2.setStatus("1");
        li.add(dto2);

        RequestDto dto3 = new RequestDto();
        dto3.setId("1");
        dto3.setName("李四");
        dto3.setStatus("1");
        li.add(dto3);

//        ArrayList<RequestDto> result = li.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
//                () -> new TreeSet<>(Comparator.comparing(o -> o.getId() + o.getName() + o.getStatus()))), ArrayList::new));

        System.out.println(li);

    }
}

打印集合如下:

使用java8 Stream API进行去重

java 复制代码
class demo {
    public static void main(String[] args) {
        List<RequestDto> li = new ArrayList<>();
        RequestDto dto1 = new RequestDto();
        dto1.setId("1");
        dto1.setName("张三");
        dto1.setStatus("1");
        li.add(dto1);

        RequestDto dto2 = new RequestDto();
        dto2.setId("1");
        dto2.setName("张三");
        dto2.setStatus("1");
        li.add(dto2);

        RequestDto dto3 = new RequestDto();
        dto3.setId("1");
        dto3.setName("李四");
        dto3.setStatus("1");
        li.add(dto3);
        
        // java8 Stream 流去重操作通过对属性id、name、status进行去重
        ArrayList<RequestDto> result = li.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
                () -> new TreeSet<>(Comparator.comparing(o -> o.getId() + o.getName() + o.getStatus()))), ArrayList::new));

        System.out.println(result);

    }
}

结果如下:可以看出已经成功去重

根据list中Object某个属性去重

利用 TreeSet 通过 comparing 指定某个属性来去重,例如根据name属性去重

java 复制代码
// 核心代码如下,其实就是上面的多属性去重只用到了一个属性
// java8 Stream 流去重操作
        ArrayList<RequestDto> result = li.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
                () -> new TreeSet<>(Comparator.comparing(o -> o.getName()))), ArrayList::new));

结果打印如下:

distinct对某个属性去重

根据对象的某个属性去重,对属性分组后进行 distinct 操作:返回的是去重后的属性集合

java 复制代码
// 核心代码如下,返回的是属性
// java8 Stream 流去重操作
        List<String> result = li.stream().map(RequestDto::getName).distinct().collect(Collectors.toList());

打印结果如下:

distinct对集合去重

java 复制代码
// 核心代码如下,返回的是对象
// java8 Stream 流去重操作
        List<RequestDto> result = li.stream().distinct().collect(Collectors.toList());

打印结果如下:

通过利用 Java 8 的 Stream API,我们可以轻松地实现List多属性去重!

相关推荐
num_killer2 小时前
小白的Langchain学习
java·python·学习·langchain
D_FW2 小时前
数据结构第六章:图
数据结构·算法
SunkingYang2 小时前
QT编译报错:使用Lambda表达式作为槽函数,报错‘xxx‘ in capture list does not name a variable
qt·list·报错·lambda表达式·槽函数·in capture list·does not name
期待のcode3 小时前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐3 小时前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲3 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红3 小时前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥3 小时前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v3 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地3 小时前
NIO的三个组件解决三个问题
java·后端·nio