当前位置:首页 » 《关注互联网》 » 正文

java stream distinct根据list某个字段去重

17 人参与  2024年05月11日 08:42  分类 : 《关注互联网》  评论

点击全文阅读


项目场景:

java stream distinct根据list某个字段去重,普通List简单去重:

import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {        List<String> names = Arrays.asList("张三", "李四", "王五", "张三", "李四");                // 使用Stream的distinct()方法进行去重操作        List<String> distinctNames = names.stream().distinct().collect(Collectors.toList());        System.out.println("原始列表:" + names);        System.out.println("去重后的列表:" + distinctNames);    }}

很显然这种满足不了需求,我们List里的是实体对象,这里的是字符串。


前提基础: 

首先创建了一个Student类,该类包含id、name、age三个字段,使用了注解@Data,我们想根据学生的name去重。

import lombok.Data;@Datapublic class Student {    public Student(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}    private Integer id;    private String name;    private Integer age;}

解决方案:

一、Stream流 + TreeSet(推荐)

根据学生的name去重,原理:

        1、首先使用Stream API对list进行转换成流,使用toCollection方法将流中的元素放入一个TreeSet集合中,通过TreeSet实现对name字段去重;

        2、然后使用collectingAndThen方法将TreeSet集合转换成ArrayList集合;

用普通的list对象来操作需要分为两步操作,这里我们使用了Stream API提供的collect方法和Collectors类的两个静态方法toCollection和collectingAndThen来进行去重操作,不需要写繁琐的for循环,更加简洁高效。

import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.TreeSet;import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(1, "张三", 13));list.add(new Student(2, "李四", 14));list.add(new Student(3, "张三", 15));list.add(new Student(4, "王五", 16));list.add(new Student(5, "李四", 17));List<Student> distinctList = list.stream().collect(    Collectors.collectingAndThen(        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))), ArrayList<Student>::new));System.out.println(distinctList);    }}

二、Stream流 + toMap

根据学生的name去重,原理:

        1、首先使用Stream API对list进行转换成流,使用Collectors.toMap方法将对象流转换为 Map,其中键是 name 字段,值是对象本身。当遇到重复的键时,我们使用合并函数 (p1, p2) -> p1 来选择保留哪个值;

        2、然后通过提取 Map 的值集合,我们获得了去重后的结果。将集合转换成List集合;

用普通的list对象来操作需要分为两步操作,这里我们使用了Stream API来操作,不需要写繁琐的for循环,更加简洁高效。注意Map集合是无序的,所以最后打印的结果是无序的。

import java.util.ArrayList;import java.util.List;import java.util.function.Function;import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(1, "张三", 13));list.add(new Student(2, "李四", 14));list.add(new Student(3, "张三", 15));list.add(new Student(4, "王五", 16));list.add(new Student(5, "李四", 17));List<Student> distinctList = list.stream()        .collect(Collectors.toMap(Student::getName, Function.identity(), (p1, p2) -> p1))        .values()        .stream()        .collect(Collectors.toList());System.out.println(distinctList);    }}

三、重写equals和hashCode

Student类在原来的基础上,重写equals和hashCode,根据学生的name去重

import java.util.Objects;import lombok.Data;@Datapublic class Student {    public Student(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}    private Integer id;    private String name;    private Integer age;        // 重写 equals 和 hashCode 方法    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Student student = (Student) o;        return Objects.equals(name, student.name);    }    @Override    public int hashCode() {        return Objects.hash(name);    }}
import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(1, "张三", 13));list.add(new Student(2, "李四", 14));list.add(new Student(3, "张三", 15));list.add(new Student(4, "王五", 16));list.add(new Student(5, "李四", 17));List<Student> distinctList = list.stream().distinct().collect(Collectors.toList());System.out.println(distinctList);    }}

 


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/106729.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • (番外)+(全书)夏语栀祁墨寒(等风等雨等不到你+后续+结局)_夏语栀祁墨寒免费列表_笔趣阁(等风等雨等不到你+后续+结局)
  • 被公主抛弃后我爬上太后的床小说章节试读_沈昭月云舒太后全文免费无弹窗阅读_笔趣阁
  • 人面桃花长相忆阮雾梨结局+番外(阮雾梨闻砚辞)_人面桃花长相忆阮雾梨结局+番外阮雾梨闻砚辞
  • 日暮青山绿渐隐全书+后续+结局(许星森纪冰雪)_(日暮青山绿渐隐全书+后续+结局)列表_笔趣阁(许星森纪冰雪)
  • 小透明逆袭误撩后被大佬宠上天结局+番外(许惟昭方肃礼)_(小透明逆袭误撩后被大佬宠上天结局+番外)列表_笔趣阁(许惟昭方肃礼)
  • 望不穿月影西沉列表_望不穿月影西沉(顾南辰林晚意)
  • [余生尽沧海,万年路无归]小说后续在线免费阅读_「阿辰北辰修仙」口碑神作必读篇章
  • 小透明逆袭误撩后被大佬宠上天全书+后续+结局许惟昭方肃礼全书+后续+结局免费_(小透明逆袭误撩后被大佬宠上天全书+后续+结局)许惟昭方肃礼列表_笔趣阁(许惟昭方肃礼)
  • 陆依霜轩辕翊的_陆依霜轩辕翊的
  • [不踏月光不相逢]限免完整章节合集‌_[岳母如烟周枫]小说精彩章节试读
  • [重回八零渣夫悔婚娶了假千金,我换亲却嫁了真富二代]小说章节试读_顾磊赵春红柳小莲完整版在线阅读
  • 全文人面桃花长相忆阮雾梨后续全书+番外(闻砚辞阮雾梨)列表_全文人面桃花长相忆阮雾梨后续全书+番外

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1