Java 8 使用流的模式谓词 - 如何推断变量?

Java 8 Pattern predicate using Stream - how variable is inferred?

我正在阅读 "Java SE 8 for the Really Impatient",我看到了一些奇怪的代码。是这样的:

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 -> matcher(s).find()。我的意思是字符串如何以某种方式传递并成为 asPredicate 方法的 s 变量。

Predicate 接口是一个功能接口,它定义了一个抽象方法 boolean test(T t) 其中 T 在这种情况下是 String 类型,因为您正在过滤一个Stream<String>。也就是说,代码等同于:

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