簡體   English   中英

在Java 8中匹配兩個列表中的字符串

[英]Match strings in two lists in Java 8

這個問題很簡單,可以通過數千種方式解決。 但是由於我正在學習Java 8,所以我想以Java 8的方式來做。

我有兩個字符串列表,例如:

List<String> list1 = Arrays.asList("A", "B", "C", "D");
List<String> list2 = Arrays.asList("A", "D", "E");

我想從list1獲取第一個元素,並檢查字符串是否存在於list2並生成Map<Boolean, String> 像這樣:

Map<Boolean, String> resultMap = list1.stream().collect(partial -> Collectors.partitioningBy(list2.stream().filter(existing -> matchString(partial, existing))));

private static boolean matchString(String partial, String existing) {
    return partial.equals(existing);
}

上面的代碼在matchString(partial, existing)編譯錯誤:

第一個參數類型錯誤。 找到:“”,必需:“ java.lang.String”

沒什么要注意的是,在我的實際情況中,它不是簡單的字符串列表,而是更復雜的對象,並且該對象不會覆蓋equalshashcode方法。

我非常知道這可以通過不同的方式來完成。 但是有人可以讓我知道在這種特定情況下如何使用Collectors.partitioningBy

通過Collectors.partitioningBy您可以獲得Map<Boolean, List<String>> partitioningBy doc:

返回一個收集器,該收集器根據Predicate對輸入元素進行分區,並將它們組織成Map<Boolean, List<T>>

在您的情況下:

Map<Boolean, List<String>> map = list1.stream()
            .collect(Collectors.partitioningBy(list2::contains));

如果對象更復雜而不覆蓋equals / hashcode ,則可以按某些特定字段進行比較。 假設您有類似以下內容:

class ComplexObj {
    private String id;
    ...
}

Map<Boolean, List<ComplexObj>> map = list1.stream()
            .collect(Collectors.partitioningBy(obj -> list2.stream()
                    .map(ComplexObj::getId)
                    .anyMatch(id -> id.equals(obj.getId()))));

在下面使用Collectors.partitioningBy查找我的實現。 我使用List.contains()方法作為謂詞,並且效果很好。 請嘗試並分享反饋/建議。 謝謝。

package net.javapedia.streams;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class PartitioningByEx1 {

    public static void main(String[] args) {

        List<String> list1 = Arrays.asList("A", "B", "C", "D");
        List<String> list2 = Arrays.asList("A", "D", "E");

        list1.stream().collect(Collectors.partitioningBy(item -> list2.contains(item)))
                .forEach((key, val) -> System.out.println(key + "-->>" + val));
    }

}

程序輸出:

產量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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