在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;
}
為了測試它,我們將使用以下具有屬性age
, email
和name:
Person
類name:
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上找到。