如何查找列表是否包含多个谓词Java Lambda

如何查找列表是否包含多个谓词Java Lambda,java,lambda,Java,Lambda,我正试图找出如何在JavaLambda中对单个过滤器执行多个谓词,但运气不太好 我有一个字符串列表 List<String> namesList = new ArrayList(){}; namesList.add("John"); namesList.add("Jane"); namesList.add("Smith"); namesList.add("Roger"); 使用Java lambda如何测试列表中的两种方案?我将按如下方式进行测试: if (namesLis

我正试图找出如何在JavaLambda中对单个过滤器执行多个谓词,但运气不太好

我有一个字符串列表

List<String> namesList = new ArrayList(){};
namesList.add("John");
namesList.add("Jane");
namesList.add("Smith");
namesList.add("Roger");

使用Java lambda如何测试列表中的两种方案?

我将按如下方式进行测试:

    if (namesList.stream()
            .filter(x -> (x.equals("John") || x.equals(("Roger"))))
            .collect(Collectors.toSet())
            .size() == 2) {
        System.out.print("John & Roger");
    }

    if (namesList.stream()
            .filter(x -> (x.equals("Jane") || x.equals(("Smith"))))
            .collect(Collectors.toSet())
            .size() == 2) {
        System.out.print("Hane Smith");
    }

您可以将distinct和count组合起来:

if (namesList.stream()
        .filter(s -> s.equals("John") || s.equals("Roger"))
        .distinct()
        .count() == 2) {
    System.out.print("John & Roger");
}

不要使用流:只需将英语转换为代码:

if (namesList.contains("John") && namesList.contains("Roger"))
    System.out.println("John & Roger");

它更容易阅读,并且可能比基于流的方法表现得更好或更好


lambda不是正确的方法。

使用
过滤器是什么意思?由于这是一个
条件,很难用一个
过滤器来完成这项工作
通过…这可能是当时的答案,我试图找出是否有一种方法可以在单个过滤器中完成这项工作。目前我正在使用两种方法来实现这个结果。@Aeseair:我唯一能想到的是一个维护状态的lambda表达式,但这是一种相当肮脏(而且容易出错)的方法。谢谢@Bohemian。这是我最初使用的方式,但我被告知streams会更快、更轻。特别是因为我在这个例子中使用字符串而不是对象。@aeseir根据我的经验,对于少量元素,流速度要慢得多。此外,可读性胜过性能,尤其是在这种情况下-我怀疑你会注意到两者在性能上的差异,所以只需做更容易理解和维护的事情。谢谢,伙计,我希望我能接受多个答案,但我能给你的最多是竖起大拇指(如果你很接近,那也会是啤酒)
if (namesList.contains("John") && namesList.contains("Roger"))
    System.out.println("John & Roger");
if (namesList.containsAll(Arrays.asList("John", "Roger")))
    System.out.println("John & Roger");