【发布时间】: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 -> 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