在Java Stream API中有所不同

1.概述

在列表中搜索不同的元素是我們程序員通常面臨的常見任務之一。從Java 8開始,隨著Streams的加入,我們有了一個新的API,可以使用功能性方法來處理數據。

在本文中,我們將展示使用列表中對象的特定屬性來過濾集合的其他方法。

2.使用Stream API

Stream API提供了distinct()方法,該方法基於Object類的equals()方法返回列表的不同元素。

但是,如果我們要按特定的屬性進行過濾,靈活性就會降低。我們必須採取的一種替代方法是編寫一個用於維持狀態的過濾器。

2.1。使用狀態過濾器

一種可能的解決方案是實施有狀態Predicate:

public static <T> Predicate<T> distinctByKey(

 Function<? super T, ?> keyExtractor) {



 Map<Object, Boolean> seen = new ConcurrentHashMap<>();

 return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;

 }

為了測試它,我們將使用以下具有屬性ageemailname: Personname:

public class Person {

 private int age;

 private String name;

 private String email;

 // standard getters and setters

 }

為了按name獲取新的過濾集合,我們可以使用:

List<Person> personListFiltered = personList.stream()

 .filter(distinctByKey(p -> p.getName()))

 .collect(Collectors.toList());

3.使用Eclipse集合

Eclipse Collections是一個庫,它提供了其他方法來處理Java中的Streams和collections。

3.1。使用ListIterate.distinct()

ListIterate.distinct()方法允許我們使用各種HashingStrategies.過濾Stream HashingStrategies.可以使用lambda表達式或方法引用來定義這些策略。

如果我們Person's名稱過濾:

List<Person> personListFiltered = ListIterate

 .distinct(personList, HashingStrategies.fromFunction(Person::getName));

或者,如果我們要使用的屬性是原始屬性(int,long,double),則可以使用如下專用功能:

List<Person> personListFiltered = ListIterate.distinct(

 personList, HashingStrategies.fromIntFunction(Person::getAge));

3.2。 Maven依賴

我們需要將以下依賴項添加到pom.xml以便在項目中使用Eclipse集合:

<dependency>

 <groupId>org.eclipse.collections</groupId>

 <artifactId>eclipse-collections</artifactId>

 <version>8.2.0</version>

 </dependency>

您可以在Maven Central存儲庫中找到最新版本的Eclipse Collections庫。

要了解有關此庫的更多信息,我們可以轉到本文。

4.使用Vavr(Javaslang)

這是Java 8的功能庫,提供不可變的數據和功能控制結構。

4.1。使用List.distinctBy

為了過濾列表,該類提供了自己的List類,該類具有distinctBy()方法,該方法允許我們按其包含的對象的屬性進行過濾:

List<Person> personListFiltered = List.ofAll(personList)

 .distinctBy(Person::getName)

 .toJavaList();

4.2。 Maven依賴

我們將以下依賴項添加到pom.xml以在項目中使用Vavr。

<dependency>

 <groupId>io.vavr</groupId>

 <artifactId>vavr</artifactId>

 <version>0.9.0</version>

 </dependency>

您可以在Maven Central存儲庫中找到Vavr庫的最新版本。

要了解有關此庫的更多信息,我們可以轉到本文。

5.使用StreamEx

該庫為Java 8流處理提供有用的類和方法。

5.1。使用StreamEx.distinct

在提供的類中是StreamEx ,它具有一個distinct方法,我們可以向該方法發送要區分的屬性的引用:

List<Person> personListFiltered = StreamEx.of(personList)

 .distinct(Person::getName)

 .toList();

5.2。 Maven依賴

我們將以下依賴項添加到pom.xml以在項目中使用StreamEx。

<dependency>

 <groupId>one.util</groupId>

 <artifactId>streamex</artifactId>

 <version>0.6.5</version>

 </dependency>

您可以在Maven Central存儲庫中找到最新版本的StreamEx庫。

六,結論

在本快速教程中,我們基於使用標準Java 8 API的屬性以及其他庫的其他替代方法,探索瞭如何獲取Stream的不同元素的示例。

與往常一樣,完整的代碼可以在GitHub上找到