回调Lambda表达式+ JavaFX

时间:2016-08-25 11:20:15

标签: java javafx lambda

所以,我正在尝试更新一个在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);
        }
    });

2 个答案:

答案 0 :(得分:8)

只有在interfact中有一个抽象方法时,Lambda表达式才有效。由于这是Callback的情况,因此可以在这里进行。

基本上,您将anonymus类放置为(<parameters>) -> <method body>形式的lambda表达式。

在这种情况下

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

变为

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

这可以进一步简化:

  1. 如果不需要参数类型来决定要调用的方法,可以删除它们。
  2. 如果只有一个参数没有类型,则可以删除()括号。
  3. 如果方法正文只包含一个语句,则可以删除{};。如果语句是return语句,则还需要删除return关键字。
  4. 这允许您进一步简化lambda表达式

    features -> new SimpleBooleanProperty(features.getValue() != null)
    

    使用相同的方法

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

    可以更改为

    personBooleanTableColumn -> new AddPersonCell(window, tableUser)
    

答案 1 :(得分:3)

基本上,你可以做的是用一个抽象方法(一个实现所谓的@Functional接口的方法)用lambda表达式替换实现接口/抽象类的每个私有类。 Java将知道lambda对应于要覆盖的唯一方法。因此,对于以下每种情况:

SomeFunctionalClass foo = new SomeFunctionalClass() {
    @Override
    public ReturnType someMethod(Type1 someParam, Type2 someOtherParam) {
         <code goes here>
    }
} 

您将其替换为:

SomeFunctionalClass foo = (someParam, someOtherParam) -> { <code goes here> };