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

使用Java8匹配方法比较两个列表,java,java-8,java-stream,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<In

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

    }

}

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

您可以使用
过滤器
findFirst

System.out.println("If any number present in aList is present in bList : "+aList.stream().filter(num -> bList.contains(num)).findFirst().orElse(null));
System.out.println("If any number present in aList is present in bList : "+aList.stream().filter(num -> bList.contains(num)).collect(Collectors.toList());
如果找到匹配号,则打印匹配号(在第一次匹配时停止),如果未找到匹配号,则打印
null

或者,您可以将所有匹配项收集到
列表中

System.out.println("If any number present in aList is present in bList : "+aList.stream().filter(num -> bList.contains(num)).findFirst().orElse(null));
System.out.println("If any number present in aList is present in bList : "+aList.stream().filter(num -> bList.contains(num)).collect(Collectors.toList());
试试这个

aList.stream().filter(bList::contains).collect(Collectors.toSet());

调用
retainal
时会得到
java.lang.UnsupportedOperationException
的原因是
Arrays\asList
返回一个由固定大小数组支持的ArrayList。任何删除或向这些列表中添加元素的尝试都将导致上述
不支持操作异常

正如@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
列表。如果需要保留
aList
的状态,我建议在调用
retainal
之前复制
aList
。在这种情况下,建议使用的流API之一可能更合适。

Perfect,它的工作方式与您的说明一致。但是,如果有多个匹配项,这意味着我们可以打印所有匹配项。@Karthikeyan不是用
.findFirst()
终止流管道,而是将其收集到一个列表(
.collect(collector.toList()
)中,该列表将包含所有匹配项。为什么不使用Collectors.toSet()?@HadiWhy不仅仅是
列表.retainal(bList)
?@LuCio-它在线程“main”java.lang.UnsupportedOperationException中抛出
异常
异常,但这仅仅是因为您使用的是
Arrays.asList(…)
。初始化列表就像
新建ArrayList(Arrays.asList(1,3,5,6,8));