在Java 8 lambda表达式中使用?:运算符时出现异常

时间:2014-09-22 09:43:13

标签: java exception lambda

为什么在Java 8 lambda表达式中使用?:运算符时抛出异常?
当我尝试运行以下示例代码时:

import java.util.ArrayList;
import java.util.List;

public class TestClass
{
    public static void main(String[] args)
    {
        List<Foo> foos = new ArrayList<>();
        boolean b = true;
        foos.forEach(foo -> (b ? foo.doSth(1) : foo.doSth(2)));
    }

    @FunctionalInterface
    interface Foo
    {
        public void doSth(int i);
    }
}

我得到以下异常:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
at gui.marksDetection.view.TestClass.main(TestClass.java:8)

当用for-each-loop替换lambda表达式,或用if-else-block替换(b ? foo.doSth(1) : foo.doSth(2))时,一切正常,所以组合?: + lambda似乎有问题。但是,Eclipse不会将其标记为错误。

2 个答案:

答案 0 :(得分:8)

Ternary语句要求单独的部分是表达式,不是语句

不允许您在单独的分支中调用语句。

有关详细信息,请参阅Java Language specification section 15.25

答案 1 :(得分:-1)

您的代码无法使用javac进行编译:

  

不兼容的类型:lambda表达式中的错误返回类型
  缺少返回值

我怀疑这是日食中的一个错误。