Java当中List集合根据对象某个属性进行去重

关于以下方法,直接可以在自己项目创建一个类,然后进行测试使用,去重方式有很多种,文本末尾也提供了每个方法的运行结果,供大家参考使用!

文章大量使用到了Java8当中的Lambda表达式,以及stream流相关基础知识。如果您用的不熟,没关系,可以直接复制下面的方案然后进行套着使用即可,如果想深入了解的,可以看一下这两篇文章:

Lambda讲解:https://blog.csdn.net/weixin_43888891/article/details/124795863
Stream讲解:https://blog.csdn.net/weixin_43888891/article/details/124657128

测试对象:

@Data
@AllArgsConstructor
@ToString
public class User {
    @ApiModelProperty("姓名")
    private String name;

    @ApiModelProperty("性别")
    private String gender;

    @ApiModelProperty("年龄")
    private Integer age;

    @ApiModelProperty("出生日期")
    private String birthday;

    @ApiModelProperty("证件类型")
    private String paperworkType;

    @ApiModelProperty("证件号码")
    private String identityNumber;
}
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Test {
    private static final List<User> list = Arrays.asList(
            new User("张三", "男", 2, "2019-1-1", "身份证", "350781196403077840"),
            new User("李四", "男", 2, "2019-1-1", "港澳证", "350781196403077840"),
            new User("王五", "男", 9, "2019-1-1", "身份证", "350781196403077840"),
            new User("赵六", "男", 8, "2019-1-1", "身份证", "350781196403077840"),
            new User("赵六", "男", 8, "2019-1-1", "身份证", "350781196403077840"));

    /**
     * 对所有属性一样的数据进行去重
     */
    public static void allColumnDistinct() {
        List<User> collect = list.stream().distinct().collect(Collectors.toList());
        collect.forEach(System.out::println);
    }

    /**
     * 对单个属性去重,只返回去重的属性
     */
    public static void columnDistinct() {
        List<String> identityNumberList = list.stream().map(User::getIdentityNumber).distinct().collect(Collectors.toList());
        identityNumberList.forEach(System.out::println);
    }

    /**
     * 方式一:对单个属性一样的数据进行去重,下面是对身份证去重
     */
    public static void oneColumnDistinct1() {
        List<User> collect = list.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet<>(
                        Comparator.comparing(User::getIdentityNumber))), ArrayList::new));
        collect.forEach(System.out::println);
    }

    /**
     * 多个字段条件去重
     */
    public static void twoColumnDistinct() {
        List<User> collect = list.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet<>(
                        Comparator.comparing(p -> p.getIdentityNumber() + ";" + p.getPaperworkType()))), ArrayList::new));
        collect.forEach(System.out::println);
    }

    /**
     * 自定义属性判断
     *
     * @param keyExtractor
     * @param <T>
     * @return
     */
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>(1);
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

    /**
     * 方式二:对单个属性一样的数据进行去重,下面是对身份证去重
     */
    public static void oneColumnDistinct2() {
        List<User> collect = list.stream().filter(distinctByKey(b -> b.getIdentityNumber())).collect(Collectors.toList());
        collect.forEach(System.out::println);
    }

    /**
     * 方式三:对单个属性一样的数据进行去重,下面是对身份证去重
     * 利用TreeSet进行去重
     */
    public static void oneColumnDistinct3() {
        TreeSet<User> collect = new TreeSet<>(Comparator.comparing(s -> s.getIdentityNumber()));
        list.forEach(a -> collect.add(a));
        collect.forEach(System.out::println);
    }


	public static void main(String[] args) {
        System.out.println("-----------------allColumnDistinct---------------------");
        allColumnDistinct();
        System.out.println("-----------------columnDistinct---------------------");
        columnDistinct();
        System.out.println("-----------------oneColumnDistinct1---------------------");
        oneColumnDistinct1();
        System.out.println("-----------------twoColumnDistinct---------------------");
        twoColumnDistinct();
        System.out.println("-----------------oneColumnDistinct2---------------------");
        oneColumnDistinct2();
        System.out.println("-----------------oneColumnDistinct3---------------------");
        oneColumnDistinct3();
    }
}

输出结果:

在这里插入图片描述

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要根据某个对象属性去重list集合,可以按照以下步骤进行操作。 首先,我们需要自定义一个比较器(Comparator)来比较两个对象属性是否相等。比较器的作用是根据对象属性值确定两个对象是否相等。 其次,我们可以利用Java 8的流操作,使用distinct()方法来去除集合中的重复元素。在这个方法中,我们可以使用自定义的比较器来比较两个对象。 最后,我们将得到去重后的list集合。 下面是一个例子,假设我们有一个Person对象list集合,每个Person对象都有一个name属性。 ``` import java.util.ArrayList; import java.util.Comparator; import java.util.List; class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Person [name=" + name + "]"; } } public class Main { public static void main(String[] args) { List<Person> personList = new ArrayList<>(); personList.add(new Person("John")); personList.add(new Person("Jane")); personList.add(new Person("John")); // 添加重复元素 List<Person> distinctList = personList.stream().distinct(new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); // 比较name属性 } }).toList(); System.out.println(distinctList); } } ``` 运行这段代码,我们将得到去重后的list集合:[Person [name=Jane], Person [name=John]]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值