使用Java8匹配方法能够比较两个列表,并且如果两个列表中都存在匹配项,则可以获取布尔结果。
请为此找到我下面的代码。
public class StreamTest2 {
public static void main(String args[]) {
List<Integer> aList = Arrays.asList( new Integer[] {
1,3,5,6,8
});
List<Integer> bList = Arrays.asList( new Integer[] {
10, 89, 8, 9
});
//If any number in List1 present in List2
System.out.println("If any number present in aList is present in bList : "+aList.stream().anyMatch(num -> bList.contains(num)));
}
}
输出:
If any number present in aList is present in bList : true
但是,我想从两个列表中打印匹配号码,我如何打印匹配号码?
答案 0 :(得分:2)
您可以使用filter
和findFirst
:
System.out.println("If any number present in aList is present in bList : "+aList.stream().filter(num -> bList.contains(num)).findFirst().orElse(null));
这将打印找到的匹配号码(它将在第一个匹配项时停止),或者如果没有找到匹配项,则打印null
。
或者,您可以将所有匹配项收集到List
中:
System.out.println("If any number present in aList is present in bList : "+aList.stream().filter(num -> bList.contains(num)).collect(Collectors.toList());
答案 1 :(得分:2)
尝试这个
aList.stream().filter(bList::contains).collect(Collectors.toSet());
答案 2 :(得分:1)
调用java.lang.UnsupportedOperationException
时得到retainAll
的原因是Arrays#asList
返回一个由固定大小的数组支持的ArrayList。任何尝试将元素删除或添加到这些列表的操作都将导致上述UnsupportedOperationException
。
如@LuCio所建议的,解决方案是用ArraysList构造函数调用包装Arrays.asList
部分,例如:
List<Integer> aList = new ArrayList(Arrays.asList(1,3,5,6,8));
List<Integer> bList = new ArrayList(Arrays.asList(10, 89, 8, 9));
您应该可以拨打电话:
aList.retainAll(bList);
请记住,这将修改原始的aList
列表。如果您需要保留aList
的状态,那么我建议您在调用aList
之前先制作retainAll
的副本。在这种情况下,建议的Stream API之一可能会更合适。