使用Java8匹配方法比较两个列表

时间:2018-10-28 08:18:57

标签: java java-8 java-stream

使用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

但是,我想从两个列表中打印匹配号码,我如何打印匹配号码?

3 个答案:

答案 0 :(得分:2)

您可以使用filterfindFirst

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之一可能会更合适。