anyMatch 和 findAny 在 java 8 中的区别

2022-09-03 09:06:57

我有一个,并希望对其元素执行一些匹配。Array

我开始知道可以通过两种方式完成:java 8

String[] alphabet = new String[]{"A", "B", "C"};

任意匹配 :

Arrays.stream(alphabet).anyMatch("A"::equalsIgnoreCase);

查找任何 :

Arrays.stream(alphabet).filter("a"::equalsIgnoreCase)
        .findAny().orElse("No match found"));

据我所知,两者都在做同样的工作。但是,我找不到更喜欢哪一个?

有人可以请清楚他们两者之间的区别是什么。


答案 1

它们在内部执行相同的工作,但它们的返回值不同。Stream#anyMatch() 返回一个而 Stream#findAny() 返回一个与谓词匹配的对象。boolean


答案 2

有两种方式Java 8

String[] alphabet = new String[]{"A", "B", "C"};

区别在于返回值的类型:

  1. Stream#findAny()

    返回描述流中某些元素的 Optional,如果流为空,则返回空的 Optional。

    String result1 = Arrays.stream(alphabet)
            .filter("a"::equalsIgnoreCase)
            .findAny()
            .orElse("none match");
    
  2. Stream#findFirst()

    返回描述此流的第一个元素的 Optional,如果流为空,则返回空的 Optional。如果流没有遭遇顺序,则可能会返回任何元素。

    String result2 = Arrays.stream(alphabet)
            .filter("a"::equalsIgnoreCase)
            .findFirst()
            .orElse("none match");
    
  3. Stream#count()

    返回此流中的元素计数。这是简化的特殊情况,等效于:

    return mapToLong(e -> 1L).sum();
    
    boolean result3 = Arrays.stream(alphabet)
            .filter("a"::equalsIgnoreCase)
            .count() > 0;
    
  4. Stream#anyMatch(Predicate)

    返回此流的任何元素是否与提供的谓词匹配。如果确定结果不是必需的,则可能不会评估所有元素的谓词。如果流为空,则返回 false,并且不计算谓词。

    boolean result4 = Arrays.stream(alphabet)
            .anyMatch("a"::equalsIgnoreCase);
    
  5. Stream#allMatch(Predicate)

    返回此流的所有元素是否都与提供的谓词匹配。如果确定结果不是必需的,则可能不会评估所有元素的谓词。如果流为空,则返回 true,并且不计算谓词。

    boolean result5 = Arrays.stream(alphabet)
            .allMatch("a"::equalsIgnoreCase);