【问题标题】:Call Back Lambda Expressions + JavaFX回调 Lambda 表达式 + JavaFX
【发布时间】:2016-08-25 11:20:15
【问题描述】:

所以,我正在尝试更新我在 Java 6 发布时创建的旧 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);
        }
    });

【问题讨论】:

  • @DVarga,你可以不用最里面的花括号和return关键字:addColumn.setCellValueFactory(features -&gt; new SimpleBooleanProperty(features.getValue() != null));
  • 所有的人都非常擅长编程,我希望成为同样的人! :)
  • 继续练习并继续提出与这个问题一样好的问题,你会的。我也只是在学习 lambdas。

标签: java javafx lambda


【解决方案1】:

Lambda 表达式只有在交互中有一个抽象方法时才有效。因为Callback 就是这种情况,所以这里可以是一个。

基本上,您可以将匿名类与 (&lt;parameters&gt;) -&gt; &lt;method body&gt; 形式的 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 关键字也需要删除。

这使您可以将 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)

【讨论】:

    【解决方案2】:

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

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

    您将其替换为:

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

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多