使用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/zh-tw/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

發表回復

登錄後才能評論