使用stream().distinct()实现对元素的去重

一、distinct()方法介绍

在Java 8中,Stream接口是一个完全支持函数式编程风格的接口。在Stream中,distinct()方法可以实现对流中元素的去重,返回一个保证元素唯一的新流。

distinct()方法使用时需要注意以下几点:

  1. 元素需实现equals()和hashCode()方法,否则去重不生效
  2. 对于流中具有null值的元素,需要使用Objects.hashCode()进行判定

二、使用场景

Stream().distinct()方法适用于需要从数据集中获得唯一元素的场景,例如:

  1. 从数据库查询结果中获取不同的值
  2. 从文件读取中获取不同的单词或行
  3. 对列表中的元素进行去重

三、实现方法

下面是一个简单的使用stream().distinct()方法对列表元素进行去重的例子:

List numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 5, 6);
List distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());
System.out.println(distinctNumbers);

输出结果:

[1, 2, 3, 4, 5, 6]

可以看出,去重后的列表中只剩下了不同的元素。

四、元素去重的实现原理

Stream().distinct()方法的去重原理是:

  1. 在元素流中,对每个元素进行hashCode()方法的计算
  2. 将不同hashCode的元素加入新的HashSet集合中。
  3. 返回加入HashSet集合的新元素流

五、重写equals()和hashCode()方法

对于一个类的对象如果想要使用distinct()去重,则要求该类的对象需要重写equals()和hashCode()方法。

下面是一个例子:

class Person {
  private Integer id;
  private String name;

  public Person(Integer id, String name) {
    this.id = id;
    this.name = name;
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return Objects.equals(id, person.id) &&
        Objects.equals(name, person.name);
  }

  @Override
  public int hashCode() {
    return Objects.hash(id, name);
  }
}

List personList = Arrays.asList(
    new Person(1, "Tom"), 
    new Person(2, "Jerry"), 
    new Person(3, "Tom")
);
List distinctPersons = personList.stream().distinct().collect(Collectors.toList());
System.out.println(distinctPersons);

输出结果:

[Person(id=1, name=Tom), Person(id=2, name=Jerry)]

可以看出,使用distinct()方法后,列表中重复的”Tom”被成功去除,只保留了不同的元素。

六、使用forEach()方法输出流中所有元素

Stream().distinct()方法返回一个保证元素唯一的新流,如果想要检查去重后的流中是否包含某个元素,可以使用forEach()方法遍历整个流,并输出所有遍历到的元素。

下面是一个例子:

List numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 5, 6);
List distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());

distinctNumbers.forEach(System.out::println);

输出结果:

1
2
3
4
5
6

七、小结

在Java 8中,Stream接口支持函数式编程风格,提供了distinct()方法用于对流中元素进行去重。使用distinct()方法需要注意重写equals()和hashCode()方法,可以用于从数据集中获得唯一元素的场景。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/246895.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:18
下一篇 2024-12-12 13:18

相关推荐

  • Python遍历集合中的元素

    本文将从多个方面详细阐述Python遍历集合中的元素方法。 一、for循环遍历集合 Python中,使用for循环可以遍历集合中的每个元素,代码如下: my_set = {1, 2…

    编程 2025-04-29
  • Python列表中大于某数的元素处理方法

    本文将会介绍如何在Python列表中找到大于某数的元素,并对其进行进一步的处理。 一、查找大于某数的元素 要查找Python列表中大于某数的元素,可以使用列表推导式进行处理。 nu…

    编程 2025-04-29
  • Python Set元素用法介绍

    Set是Python编程语言中拥有一系列独特属性及特点的数据类型之一。它可以存储无序且唯一的数据元素,这使得Set在数据处理中非常有用。Set能够进行交、并、差集等操作,也可以用于…

    编程 2025-04-29
  • Python编程实现列表元素逆序存放

    本文将从以下几个方面对Python编程实现列表元素逆序存放做详细阐述: 一、实现思路 一般来说,使用Python将列表元素逆序存放可以通过以下几个步骤实现: 1. 定义一个列表 2…

    编程 2025-04-29
  • Python集合加入元素

    Python中的集合是一种无序且元素唯一的集合类型。集合中的元素可以是数字、字符串、甚至是其他集合类型。在本文中,我们将从多个方面来探讨如何向Python集合中加入元素。 一、使用…

    编程 2025-04-29
  • Java创建一个有10万个元素的数组

    本文将从以下方面对Java创建一个有10万个元素的数组进行详细阐述: 一、基本介绍 Java是一种面向对象的编程语言,其强大的数组功能可以支持创建大规模的多维数组以及各种复杂的数据…

    编程 2025-04-28
  • 如何在谷歌中定位系统弹框元素

    本文将从以下几个方面为大家介绍如何在谷歌中准确地定位系统弹框元素。 一、利用开发者工具 在使用谷歌浏览器时,我们可以通过它自带的开发者工具来定位系统弹框元素。 首先,我们可以按下F…

    编程 2025-04-28
  • Python三种基本输入元素

    本文将从多个方面对于Python三种基本输入元素进行详细的阐述并给出代码示例。 一、Python三种基本输入元素解答 Python三种基本输入元素包括命令行参数、标准输入和文件输入…

    编程 2025-04-28
  • 如何使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnotempty(

    本文将详细介绍如何在Java编程中使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnote…

    编程 2025-04-28
  • Python元组元素分成单个整数

    本文将介绍如何将Python元组中的元素分成单个整数,并提供多种实现方式。 一、使用for循环遍历元组实现 可以通过for循环遍历元组的每一个元素,再将其转换成整数,并存储在新的列…

    编程 2025-04-28

发表回复

登录后才能评论