【问题标题】:Java 8 lambdas executionJava 8 lambda 执行
【发布时间】:2015-09-03 19:13:20
【问题描述】:

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

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

现在我收到以下错误:

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

【问题讨论】:

  • 我看到的例子没有使用 {},因为它是一个单一的语句。 Tutorial
  • return p 周围没有 {} 的情况相同。我不认为这是问题所在。
  • 您的错误在于假设 Function 具有任何特殊状态,以便自动将 lambda 的类型强制转换为它。您的表达式实际上没有目标类型约束。
  • 您可以通过告诉编译器 lambda 的类型来修复代码: boolean x = ((Function) p->p).apply(true);

标签: java lambda java-8 functional-interface


【解决方案1】:

根据 JLS section 15.27:

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

也可以在 return statement 中使用 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多