Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用流的Java8模式谓词-如何推断变量?_Java_Functional Programming_Java 8_Java Stream_Predicate - Fatal编程技术网

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

使用流的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

我正在阅读“JavaSE8的真正不耐烦”,我看到一些奇怪的代码。是这样的:

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();