簡體   English   中英

如何使用Stream比較2個列表並獲取元素形式的比較列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM