将回调转换为Java 8 Lambda表达式

时间:2014-06-01 10:01:44

标签: java lambda java-8 javafx-8

在我目前的项目中,我正在开发一个包含TreeTableView的简单JavaFX GUI。 要初始化视图,我有以下代码。

cmdNrColumn.setCellFactory(new Callback<TreeTableColumn<Command, Command>, TreeTableCell<Command, Command>>() {
    @Override public TreeTableCell<Command, Command> call(final TreeTableColumn<Command, Command> p) {
        return new TreeTableCell<Command, Command>() {
            @Override protected void updateItem(Command item, boolean empty) {
                super.updateItem(item, empty);

                TreeTableView treeTable = p.getTreeTableView();

                if (getIndex() >= treeTable.getExpandedItemCount()) {
                    setText(null);
                } else {
                    TreeItem<Command> treeItem = treeTable.getTreeItem(getIndex());
                    if (item == null || empty || treeItem == null || treeItem.getValue() == null) {
                        setText(null);
                    } else {
                        setText(Integer.toString(item.getCmdNr()));
                    }
                }
            }
        };
    }
});

刚接触Java 8我不太确定是否以及如何将其简化为Lambda表达式。

如何将有关如何将复杂和嵌套调用转换为Lambda表达式的任何帮助或教程都将不胜感激

谢谢!

1 个答案:

答案 0 :(得分:12)

您可以将外部匿名类转换为lambda表达式:

cmdNrColumn.setCellFactory(p ->
    new TreeTableCell<Command, Command>() {
        @Override
        protected void updateItem(Command item, boolean empty) {
            // ...
            TreeTableView treeTable = p.getTreeTableView();
            // ...
        }
    });

但是,内部匿名类不可能进行相同的转换,因为TreeTableCell是一个抽象类,而lambda表达式只能用于接口。