使用流的Java8模式谓词-如何推断变量?
我正在阅读“JavaSE8的真正不耐烦”,我看到一些奇怪的代码。是这样的:使用流的Java8模式谓词-如何推断变量?,java,functional-programming,java-8,java-stream,predicate,Java,Functional Programming,Java 8,Java Stream,Predicate,我正在阅读“JavaSE8的真正不耐烦”,我看到一些奇怪的代码。是这样的: final Pattern pattern = Pattern.compile("....."); final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar") .filter(pattern.asPredicate()) .count(); 我只是觉得asPredicate方法应该是 public boolean asP
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();
}
但我的问题是流如何将字符串传递给模式实例?如何将“Cristian”、“Daniel”、“Ortiz”、“Cuellar”分别传递给方法s->matcher.find()
。我的意思是字符串如何以某种方式传递并成为asPredicate方法的s
变量。该接口是一个函数接口,它定义了一个抽象方法布尔测试(T)
,其中T
在本例中是String
类型,因为您在流上进行过滤。换言之,该代码相当于:
final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar")
.filter(new Predicate<String>() {
public boolean test(String s) {
return matcher(s).find();
}
})
.count();
final long count=Stream.of(“克里斯蒂安”、“丹尼尔”、“奥尔蒂斯”、“奎利亚尔”)
.filter(新谓词(){
公共布尔测试(字符串s){
返回匹配器。查找();
}
})
.count();
你知道你可以将certainKindOfExpression
传递给.filter(…)
,那么为什么你可以调用someMethod()
,它包含一个返回certainKindOfExpression
,然后将someMethod()
的结果传递给.filter(…)
?这对lambda表达式来说并不特别。如果您了解在filter
中传递lambda表达式是如何工作的,正如您所声称的,那么您应该了解相同的lambda表达式如何与return
语句一起工作。当然,无论调用lambda的参数s
还是a
,都没有区别。
final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar")
.filter(new Predicate<String>() {
public boolean test(String s) {
return matcher(s).find();
}
})
.count();