如何使用 lambda 编写新的 ListChangeListener<Item>()?

2022-09-03 04:25:35

如何在java8中用lambda编写一个新的ListChangeListener()?

listItems.addListener(new ListChangeListener<Item>() {
    @Override
    public void onChanged(
        javafx.collections.ListChangeListener.Change<? extends Item> c) {
        // TODO Auto-generated method stub
    }
});

这是我尝试过的:

listItems.addListener(c->{});

但日食指出:

方法 addListener(ListChangeListener) 对于 ObservableList 类型是不明确的。

该列表声明为:

ObservableList<Item> listItems = FXCollections.observableArrayList();

答案 1

由于继承自接口,编译器无法确定要调用哪个版本。通过强制转换指定 lambda 的类型应该可以解决此问题。ObservableListaddListener(InvalidationListener)Observable

listItems.addListener((ListChangeListener)(c -> {/* ... */}));

您还可以显式指定 的类型:c

listItems.addListener((ListChangeListener.Change<? extends Item> c) -> {/* ... */});

答案 2

此代码无需指定类型即可工作。

listView.focusedProperty ().addListener ( (arg, oldVal, newVal) -> System.out
        .printf ("ListView %s focus%n", (newVal ? "in" : "out of")));

推荐