【发布时间】:2014-09-22 09:43:13
【问题描述】:
为什么在 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 不会将其标记为错误。
【问题讨论】:
-
您的代码无法编译,但 Java 允许您运行它并查看。当谈到编译问题所在时,它会抛出异常。您的问题是语法错误;你的括号太多了。
-
"foo ->" 这是什么在 foos.forEach(foo -> (b ? foo.doSth(1) : foo.doSth(2)));。你能描述一下它代表什么吗?
-
@Nateowami:你的意思是使用 "b ? foo.doSth(1) : foo.doSth(2)" 而不是使用 "(b ? foo.doSth(1) : foo.doSth( 2))" -> 这会引发相同的异常。
-
是的;虽然这不是唯一的问题,但括号太多是行不通的,而且更难追踪真正的问题。