我的Java 8测试代码正在抱怨。我的理解是,有效方法的返回类型是一个谓词,它评估为布尔值,而Stream中的过滤方法也需要谓词。我的理解是错的吗?任何人都可以帮我修复此错误
*public class Main{
public static void main(String... args){
Stream.of("12/31/2014",
"01-01-2015",
2016").filter(Main::valid).forEach(s ->
out.println(s));
}
public static Predicate<Boolean> valid(String dt){
return p->dt.length()>0;
}
}*
错误:不兼容的类型:方法引用中的错误返回类型 java.util.function.Predicate无法转换为boolean
JDK:1.8.0_102 IDE:IntelliJ IDEA - 2017.2.5社区版
感谢您的帮助。
答案 0 :(得分:1)
valid
返回类型为Predicate<Boolean>
,但filter
等待返回类型为boolean
的lambda。所以看起来应该是(不确定它是否符合您的初始意图):
public class Main{
public static void main(String... args){
Stream.of("12/31/2014", "01-01-2015", "2016")
.filter(Main::valid)
.forEach(s ->out.println(s));
}
public static boolean valid(String dt){
return dt.length()>0;
}
}
使用valid
函数过滤流。
在使用方法引用之前,只需尝试编写需要过滤的lambda。 filter
之前的流的类型为Stream<String>
,因此lambda必须为String
并返回boolean
(这对于任何Predicate
都是必需的)。所以它可能看起来像:
Stream.of("12/31/2014", "01-01-2015", "2016")
.filter(s -> s.length()>0)
现在,您可以尝试查找完全符合此工作要求的现有功能,例如valid
,然后您可以将该呼叫替换为.filter(Main::valid)
。
现在,如果你有一个方法可以返回Predicate<String>
(因为你的实际流将String
注入谓词),你可以写:
public class Main{
public static void main(String... args){
Stream.of("12/31/2014", "01-01-2015", "2016")
.filter(Main::valid())
.forEach(s->out.println(s));
}
public static Predicate<String> valid(){
return s->s.length()>0;
}
}
您注入以过滤通过调用valid
构建的谓词。