回调Lambda表达式+ JavaFX

Mil*_*lan 3 java lambda javafx

所以,我正在尝试更新我在Java 6 Release上创建的旧JavaFX应用程序.我得到了一个提示,我可以转换当前的代码并使用lambda表达式,有人可以帮助我在这里转换这段代码或以某种方式指导我?

// define a simple boolean cell value for the action column so that the column will only be shown for non-empty rows.
    addColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<UserDetails, Boolean>, ObservableValue<Boolean>>() {
        @Override public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<UserDetails, Boolean> features) {
            return new SimpleBooleanProperty(features.getValue() != null);
        }
    });

    // create a cell value factory with an add button for each row in the table.
    addColumn.setCellFactory(new Callback<TableColumn<UserDetails, Boolean>, TableCell<UserDetails, Boolean>>() {
        @Override public TableCell<UserDetails, Boolean> call(TableColumn<UserDetails, Boolean> personBooleanTableColumn) {
            return new AddPersonCell(window, tableUser);
        }
    });
Run Code Online (Sandbox Code Playgroud)

fab*_*ian 8

只有在interfact中有一个抽象方法时,Lambda表达式才有效.因为这是Callback可以在这里的情况.

基本上你将anonymus类放在表单的lambda表达式中(<parameters>) -> <method body>.

在这种情况下

new Callback<TableColumn.CellDataFeatures<UserDetails, Boolean>, ObservableValue<Boolean>>() {
    @Override public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<UserDetails, Boolean> features) {
        return new SimpleBooleanProperty(features.getValue() != null);
    }
}
Run Code Online (Sandbox Code Playgroud)

(TableColumn.CellDataFeatures<UserDetails, Boolean> features) -> {
    return new SimpleBooleanProperty(features.getValue() != null);
}
Run Code Online (Sandbox Code Playgroud)

这可以进一步简化:

  1. 如果不需要参数类型来决定要调用的方法,则可以删除它们.
  2. 如果只有一个参数没有类型,则()可以删除括号.
  3. 如果方法体中只包含一个声明中,{};可以被删除.如果语句是return语句,则还return需要删除关键字.

这允许您进一步简化lambda表达式

features -> new SimpleBooleanProperty(features.getValue() != null)
Run Code Online (Sandbox Code Playgroud)

使用相同的方法

new Callback<TableColumn<UserDetails, Boolean>, TableCell<UserDetails, Boolean>>() {
    @Override public TableCell<UserDetails, Boolean> call(TableColumn<UserDetails, Boolean> personBooleanTableColumn) {
        return new AddPersonCell(window, tableUser);
    }
}
Run Code Online (Sandbox Code Playgroud)

可以改为

personBooleanTableColumn -> new AddPersonCell(window, tableUser)
Run Code Online (Sandbox Code Playgroud)