大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。
在 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多属性去重!