[英]How to compare 2 lists using Stream and get element form compare list?
//FullName(String name, String fullName)
List<FullName> fullNameList = Arrays.asList(
new FullName("Alpha", "Alpha Maz"),
new FullName("Beta", "Beta Sew"),
new FullName("Delta", "Delta Non"),
new FullName("Indigo", "Indigo Loe")
);
List<String> nameList = Arrays.asList(new String[] {"Delta","Alpha"});
讓我們以上面的示例列表為例。 我想將 nameList 與 fullNameList 進行比較,如果找到任何匹配項,則返回全名。
我必須使用 nameList 作為主要的,因為我希望結果遵循 nameList 中的序列,我不知道如何從比較列表 (fullNameList) 中“收集”元素
String result= nameList.stream()
.filter(v -> fullNameList.stream().anyMatch(s -> s.getName().equals(v)))
.collect(Collectors.joining(","));
Actual Result : "Delta,Alpha"
Expected Result : "Delta Non,Alpha Maz"
知道如何使用 Java 8 Stream 做到這一點嗎?
Map<String, String> nameMapper = fullNameList.stream()
.collect(Collectors.toMap(FullName::getFirstName, FullName::getFullName));
List<String> filteredList = nameList.stream()
.filter(nameMapper::containsKey)
.map(nameMapper::get)
.collect(Collectors.toList());
System.out.println("nameList = " + nameList);
System.out.println("filteredList = " + filteredList);
nameList = [Indigo, Alpha, Delta] 過濾列表 = [Indigo Loe, Alpha Maz, Delta Non]
nameList = [Delta, Alpha] 過濾列表 = [Delta Non, Alpha Maz]
盡管創建 Map 會產生開銷,但在實時應用程序的情況下,如果列表數量龐大,那么迭代成本將降低,因為獲取是 O(1),因為 String 本身不太可能產生哈希沖突。 在這種情況下,您的提取也是 O(log n)。
如果列表較小,我認為 Eran 的回答更合適。
您需要使用map
而不是filter
以將短名稱映射到相應的全名。
String result=
nameList.stream()
.map(v -> fullNameList.stream()
.filter(s -> s.getName().equals(v))
.findFirst()
.map(FullName::getFullName))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.joining(","));
這是假設FullName
類有一個getFullName()
方法來返回您希望收集的數據。
只需對代碼稍作改動,即可獲得預期的輸出。
String res = fullNameList.stream().filter(f -> nameList.stream().anyMatch(n -> n.equals(f.getName()))).map(f -> f.getfullName()).collect(Collectors.joining(","));
輸出:Alpha Maz,Delta Non
如果您將nameList
限制為主要,那么您可以使用以下內容:
String result = nameList.stream()
.flatMap(name -> fullNameList.stream()
.filter(fullName -> fullName.getName().equals(name))
.map(FullName::getFullName)
)
.collect(Collectors.joining(","));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.