【发布时间】:2017-10-16 23:52:28
【问题描述】:
我下面的 Java 8 测试代码在抱怨。我的理解是,valid 方法的返回类型是一个 Predicate,它评估为 Boolean,Stream 中的 filter 方法也需要 Predicate。难道我的理解有误?谁能帮我解决这个错误
*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 无法转换为布尔值
JDK:1.8.0_102 IDE:IntelliJ IDEA - 2017.2.5 社区版
感谢您的帮助。
【问题讨论】:
-
你的方法应该返回一个布尔值,而不是一个谓词。
Main::valid已经是谓词。此外,您只需执行return dt.length() > 0即可。 -
我想返回谓词
-
如果要返回谓词,则必须直接调用返回它的方法,并且由于谓词在调用时获取值,因此返回它的方法不需要这样价值。构建谓词的方法如下所示:
Predicate<String> buildPredicate() { return s->s.length()>0; },然后像...filter( buildPredicate() )...一样调用它(这是为了匹配你的风格,通常你宁愿只做...filter( s -> s.length() > 0)...)。 -
请注意
Predicate<Boolean>指定一个谓词,该谓词可以针对Boolean类型的输入 进行评估。 type 参数与评估Predicate的结果无关(通过其test()方法)。