【问题标题】:Difference between anyMatch and findAny in java 8java 8中anyMatch和findAny的区别
【发布时间】:2017-10-26 01:26:03
【问题描述】:

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

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

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

任意匹配:

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

findAny:

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

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

有人能说清楚它们之间有什么区别吗?

【问题讨论】:

    标签: java arrays java-8 java-stream


    【解决方案1】:

    它们在内部做同样的工作,但它们的返回值不同。 Stream#anyMatch() 返回一个 booleanStream#findAny() 返回一个与谓词匹配的对象。

    【讨论】:

    • 他们几乎做同样的工作。 anyMatch 是短路操作,但filter 将始终处理整个流。
    • @JornVernee findAny 代码:if (!stop && predicate.test(t) == matchKind.stopOnPredicateMatches) { stop = true; ... 它是短路的。
    • @JornVernee 这是本周第三次! :( 是的,它是 jdk-9;这是我的默认设置。抱歉
    • @MehrajMalik 好吧,它应该会在 2017/07/27 上发布,从现在开始不会太久。
    • @JornVernee 你可能在这里有一些“实质”。一个通过FindOps 实现,另一个通过MatchOps 实现。它可以很容易地完成,这样match 将调用find 并在结果Optional 上返回isPresent。我只知道在我明白为什么之前我无法正常入睡……
    【解决方案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()

      返回此流中元素的计数。这是reduction 的一个特例,相当于:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 2018-06-09
      • 1970-01-01
      • 2019-11-30
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多