14

我怎样才能在 Java 8 中做这样的事情?

boolean x = ((boolean p)->{return p;}).apply(true);

现在我收到以下错误:

此表达式的目标类型必须是函数式接口

4

1 回答 1

25

根据 JLS第 15.27 节

如果 lambda 表达式出现在程序中的赋值上下文(第 5.2 节)、调用上下文(第 5.3 节)或强制转换上下文(第 5.5 节)之外的某个地方,则这是一个编译时错误。

也可以在return语句中使用 lambda 表达式。

然后,我们可以用四种不同的方式重写您的示例:

  • 通过创建分配上下文:

    Function<Boolean, Boolean> function = p -> p;
    boolean x = function.apply(true);
    
  • 通过创建调用上下文:

    foobar(p -> p);
    
    private static void foobar(Function<Boolean, Boolean> function) {
        boolean x = function.apply(true);
    }
    
  • 通过创建强制转换上下文:

    boolean x = ((Function<Boolean, Boolean>) p -> p).apply(true);
    
  • 使用return语句:

    boolean x = function().apply(true);
    
    private static Function<Boolean, Boolean> function() {
        return p -> p;
    }
    

此外,在这个简单的示例中,整个 lambda 表达式可以重写为:

UnaryOperator<Boolean> function = UnaryOperator.identity();
于 2015-09-03T19:31:40.307 回答