使用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
但是,我想打印两个列表中的匹配号,如何打印匹配号?
发布于 2018-10-28 16:21:58
您可以使用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());
发布于 2018-10-28 16:25:32
试试这个
aList.stream().filter(bList::contains).collect(Collectors.toSet());
发布于 2018-10-29 03:03:15
之所以在调用retainAll
时得到java.lang.UnsupportedOperationException
,是因为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
的状态,那么我建议在调用retainAll
之前复制一份aList
。在这种情况下,建议使用的Stream API中的一个可能更适合。
https://stackoverflow.com/questions/53029599
复制相似问题