我正在查看lambda和javaFX示例项目“MaryHadALittleLambda”(https://github.com/steveonjava/MaryHadALittleLambda)。
除了方法之外,所有内容都编译得很好private void populateCells(Group root, final SpriteView.Mary mary) {
// Gratuitous use of lambdas to do nested iteration!
Group cells = new Group();
IntStream.range(0, HORIZONTAL_CELLS).mapToObj(i ->
Rectangle rect = new Rectangle(i * CELL_SIZE, j * CELL_SIZE, CELL_SIZE, CELL_SIZE);
rect.setFill(Color.rgb(0, 0, 0, 0));
rect.setStrokeType(StrokeType.INSIDE);
rect.setStroke(Color.BLACK);
rect.setOnMousePressed(e -> mary.moveTo(new Location(i, j)));
return rect;
})
).flatMap(s -> s).forEach(cells.getChildren()::add); // <-- ERROR HERE
root.getChildren().add(cells);
}
因为我在forEach行上的Eclipse中出现错误,
The type ObservableList<Node> does not define add(Object) that is applicable here
forEach采用方法引用 cells 对象的实例方法,这对我来说非常有效。如果我使用以下lambda,它可以正常工作:
).flatMap(s -> s).forEach(r -> cells.getChildren().add((Rectangle) r));
因此,似乎java 1.8的每个功能都在为这个javaFx引用编译安全。 我的猜测是我的版本或Java设置有问题?我正在使用:
Eclipse Standard/SDK version: Kepler Service Release 2
Eclipse Java Development Tools Patch with Java 8 support (for Kepler SR2)
使用此Java版本的JRE(从命令行输出):
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
感谢。
答案 0 :(得分:1)
我将通过提供一些更新来回答我自己的问题: 我联系了建议我尝试java编译器的作者,而不是eclipse&#s;使用Ant构建(因此使用jdk javac编译器)编译得很好,应用程序运行。
当我在eclipse中查看java 8支持的状态时,似乎有很多事情需要解决:https://bugs.eclipse.org/bugs/buglist.cgi?quicksearch=1.8%20lambda
正如@jewelsea指出的那样,Intellij Idea会显示错误,但会编译并执行(我假设它使用了jdk提供的javac)。
所以答案是:等待eclipse和/或jdk即将发布的更新。这个特殊情况很容易解决。
真正的问题是mapToObj
提供Stream<Object>
,循环会将Object
传递给期望::add
个实例的Node
(作为{ {1}}是。
答案 1 :(得分:0)
我遇到了同样的问题。这必须是Eclipse编译器中类型推断的某种错误。我发现在mapToObj中手动提取函数时它也会编译:
private void populateCells(Group root, final SpriteView.Mary mary) {
IntFunction<Stream<Rectangle>> mapper = i -> IntStream.range(0,
VERTICAL_CELLS)
.mapToObj(
j -> {
Rectangle rect = new Rectangle(i * CELL_SIZE, j
* CELL_SIZE, CELL_SIZE, CELL_SIZE);
rect.setFill(Color.rgb(0, 0, 0, 0));
rect.setStrokeType(StrokeType.INSIDE);
rect.setStroke(Color.BLACK);
rect.setOnMousePressed(e -> mary
.moveTo(new Location(i, j)));
return rect;
});
// Gratuitous use of lambdas to do nested iteration!
Group cells = new Group();
IntStream.range(0, HORIZONTAL_CELLS).mapToObj(mapper).flatMap(s -> s)
.forEach(cells.getChildren()::add);
root.getChildren().add(cells);
}