方法引用中的错误返回类型:java.util.function.Predicate

时间:2017-10-16 15:19:03

标签: java predicate

我的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社区版

感谢您的帮助。

1 个答案:

答案 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构建的谓词。