错误 return 输入方法参考:java.util.function.Predicate

bad return type in method reference: java.util.function.Predicate

我下面的 Java 8 个测试代码在抱怨。我的理解是,valid 方法的 return 类型是一个 Predicate,其计算结果为布尔值,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;   
   } 
}*

错误:类型不兼容:方法参考中的错误 return 类型 java.util.function.Predicate 无法转换为布尔值

JDK: 1.8.0_102 IDE:IntelliJ IDEA - 2017.2.5 社区版

感谢您的帮助。

valid return 类型是 Predicate<Boolean>filter 等待 return 类型是 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 和 return 和 boolean(这是任何 Predicate 所必需的).所以它可能看起来像:

Stream.of("12/31/2014", "01-01-2015", "2016")
      .filter(s -> s.length()>0)

现在你可以尝试找到一个现有的函数来完成这项工作,比如 valid,然后你可以用 .filter(Main::valid).

替换调用

现在如果你有一个方法 returns 你是 Predicate<String>(因为你的实际流将 Strings 注入谓词)你可以写:

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.

构建的谓词