【问题标题】:Java 8 Pattern predicate using Stream - how variable is inferred?使用 Stream 的 Java 8 模式谓词 - 如何推断变量?
【发布时间】:2017-01-31 03:10:38
【问题描述】:

我正在阅读“真正不耐烦的 Java SE 8”,并且看到了一些奇怪的代码。是这样的:

final Pattern pattern = Pattern.compile(".....");
final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar")
      .filter(pattern.asPredicate())
      .count();

我只是认为 asPredicate 方法类似于

public boolean asPredicate(String stringToMatch){
    .....
}

但真正的实现是这样的

public Predicate<String>asPredicate(){
    return s -> matcher(s).find();
}

我知道我可以使用这样完全合法的东西:

final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar")
      .filter(a->pattern.matcher(a).find())
      .count();

但我的问题是流如何将 String 传递给 Pattern 实例?如何将 "Cristian","Daniel","Ortiz","Cuellar" 传递给方法s -&gt; matcher(s).find()。我的意思是字符串如何以某种方式传递并成为 asPredicate 方法的 s 变量。

【问题讨论】:

  • 你知道你可以将certainKindOfExpression传递给.filter(…),那么为什么你可以改为调用someMethod(),其中包含一个return certainKindOfExpression然后传递@的结果是一个谜987654331@ 到.filter(…)?这对于 lambda 表达式来说并不特别。如果您了解在 filter 中传递 lambda 表达式的工作原理,正如您所声称的,您应该了解相同的 lambda 表达式如何与 return 语句一起工作。当然,无论你调用 lambda 的参数 s 还是 a 都没有区别。

标签: java functional-programming java-8 java-stream predicate


【解决方案1】:

Predicate 接口是一个函数式接口,它定义了一个抽象方法boolean test(T t),其中T 在这种情况下是String 类型,因为您正在过滤Stream&lt;String&gt;。也就是说,代码等价于:

final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar")
  .filter(new Predicate<String>() {
       public boolean test(String s) {
          return matcher(s).find();
       }
   })
  .count();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多