【问题标题】:bad return type in method reference: java.util.function.Predicate方法参考中的错误返回类型:java.util.function.Predicate
【发布时间】: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() &gt; 0 即可。
  • 我想返回谓词
  • 如果要返回谓词,则必须直接调用返回它的方法,并且由于谓词在调用时获取值,因此返回它的方法不需要这样价值。构建谓词的方法如下所示:Predicate&lt;String&gt; buildPredicate() { return s-&gt;s.length()&gt;0; },然后像 ...filter( buildPredicate() )... 一样调用它(这是为了匹配你的风格,通常你宁愿只做...filter( s -&gt; s.length() &gt; 0)...)。
  • 请注意Predicate&lt;Boolean&gt; 指定一个谓词,该谓词可以针对Boolean 类型的输入 进行评估。 type 参数与评估 Predicate 的结果无关(通过其 test() 方法)。

标签: java predicate


【解决方案1】:

valid 返回类型为Predicate&lt;Boolean&gt;,但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&lt;String&gt; 类型,因此 lambda 必须采用 String 并返回 boolean(这是任何 Predicate 所必需的)。所以它可能看起来像:

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

现在您可以尝试找到一个完全可以完成工作的现有函数,例如valid,然后您可以将调用替换为.filter(Main::valid)。

现在,如果您有一个返回 Predicate&lt;String&gt; 的方法(因为您的实际流将 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 构造的谓词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2020-11-21
    • 2015-08-30
    • 2018-09-26
    • 2018-05-12
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多