[英]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”
沒什么要注意的是,在我的實際情況中,它不是簡單的字符串列表,而是更復雜的對象,並且該對象不會覆蓋equals
或hashcode
方法。
我非常知道這可以通過不同的方式來完成。 但是有人可以讓我知道在這種特定情況下如何使用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.