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

这篇具有很好参考价值的文章主要介绍了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();
    }
}

输出结果:

java list根据对象属性去重,# Java基础,list,java,jvm文章来源地址https://www.toymoban.com/news/detail-560209.html

到了这里,关于Java当中List集合根据对象某个属性进行去重的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java用stream根据实体的某个属性对列表进行排序

    用stream流根据实体的某个属性对列表进行排序 假设有一个实体类 Person,包含两个属性 name 和 age,你可以使用 stream 流的 sorted() 方法来按照某两个字段进行排序。以下是一个示例代码: 在上述代码中,我们将 personList 转换成流后,调用了 sorted() 方法,并且使用 Comparator 的

    2024年02月06日
    浏览(55)
  • Java中使用流将两个集合根据某个字段进行过滤去重?

    要是需要GPT Plus账号的小伙伴可以联系我~ 在Java中,您可以使用流(Stream)来过滤和去重两个集合。下面是一个示例代码,展示如何根据对象的某个字段进行过滤和去重操作: 在这个示例中,我们创建了一个 Person 类表示人员信息,包含 name 和 age 两个字段。我们使用流的 filte

    2024年02月12日
    浏览(52)
  • java的list数组按数组中对象的某个属性排序

    在 Java 中,可以使用 Collections.sort() 方法和 Comparator 接口来对 List 中的对象按照对象的某个属性进行排序。以下是一个示例代码: 假设有一个 Person 类,它包含一个 name 字符串属性和一个 age 整数属性,我们可以通过对 ListPerson 类型的列表进行排序,按照 Person 对象的 age 属性

    2024年02月04日
    浏览(45)
  • java8 List根据元素对象属性去重

    1.使用Collectors.collectingAndThen链式去重 代码: main: 结果: 或者可以利用map也可以: 或: 或者不用链式也可以分开: Collectors.collectingAndThen()  函数应该最像  map and reduce  了, 它可接受两个参数,第一个参数用于  reduce 操作,而第二参数用于  map 操作 。 也就是, 先把流中

    2024年02月12日
    浏览(68)
  • java 对象list使用stream根据某一个属性转换成map的几种方式

    可以使用Java 8中的Stream API将List转换为Map,并根据某个属性作为键或值。以下是一些示例代码: 在这个示例中,将Person对象列表转换为Map,其中键为Person对象的name属性,值为Person对象本身。 在这个示例中,将Person对象列表转换为Map,其中键为Person对象本身,值为Person对象的

    2024年02月13日
    浏览(65)
  • Java中List集合对象去重及按属性去重的8种方法

    是大家最容易想到的,先把List数据放入Set,因为Set数据结构本身具有去重的功能,所以再将SET转为List之后就是去重之后的结果。这种方法在去重之后会改变原有的List元素顺序,因为HashSet本身是无序的,而TreeSet排序也不是List种元素的原有顺序。 去重后的集合: [kobe, james,

    2024年04月15日
    浏览(144)
  • Java中List对象集合按照对象中某字段进行排序

    在Java中,可以使用List集合对象的sort(Comparator? super E c)方法,按照对象中某字段对List集合进行排序 栗子: 打印输出结果如下:

    2024年02月12日
    浏览(56)
  • JavaScript对象数组根据某个属性值筛选分类

    🤵 作者 : coderYYY 🧑 个人简介 :前端程序媛,目前主攻 web前端 ,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回!!) 👉 个人专栏推荐 :《前端项目教程以及代码》 在开发中,这种需求还是挺常见的,常用于处理后端返回的数据

    2024年02月06日
    浏览(49)
  • Vue根据对象中的某个属性来排序对象数组【入门】

    要对对象数组按照其中某个属性进行排序,我们可以使用 JavaScript 的 sort() 方法,并传入一个自定义的比较函数。在这个比较函数中,我们可以指定按照哪个属性进行排序。 假设有一个对象数组 items,其中每个对象都包含一个 name 属性和一个 age 属性,我们可以使用以下代码

    2024年02月09日
    浏览(42)
  • Stream流 - 两个list集合对象属性的合并、对象属性值运算

    📅 合并两个 list<map>, 并将 userId 相同的所有属性合并到一个 map 中 list1中对象的属性:userId、userName list2中对象的属性:userId、gender、age 📌 最终总集合中对象的属性:userId、userName、gender、age 运行结果: 结果可见,userId 相同的所有属性合并到集合 list1中。 📅 合并两个

    2024年02月06日
    浏览(132)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包