维护过滤的ObservableList的最基本方法是什么?

时间:2014-11-20 07:36:45

标签: java collections javafx

假设您有一个基类型对象列表(在我的例子中为NotebookEntry),此列表包含各种后代类型的对象(如NotebookEntryPlainText)。这个主人ObservableList<NotebookEntry>由笔记本管理器维护,但是各种控件需要从该主列表创建自己的过滤列表 - 比如说只有纯文本条目。这些列表必须包括主列表中适用的所有条目,但如果从主列表中删除条目,则这些列表不得包含该条目。

我提出了扩展ListBinding的绑定,这避免了必须实现任何侦听器。绑定是有目的的单向。

代码非常简单:

public class ObservableFilteredList<T> extends ListBinding<T>
{
    private final ObservableList<T> masterlist;
    private final Predicate<T> predicate;

    public ObservableFilteredList(ObservableList<T> _masterlist, Predicate<T> _p)
    {
        masterlist = _masterlist;
        predicate = _p;
        super.bind(masterlist);
    }

    @Override
    public void dispose()
    {
        super.unbind(masterlist);
    }

    @Override
    protected ObservableList<T> computeValue()
    {
        return FXCollections.observableList(
                masterlist.parallelStream()
                .filter(predicate)
                .collect(Collectors.toList())
                );
    }
}

这是实现此功能的最优雅方式吗?这已经在JDK 8中实现了吗?我看了,但也许我没有找到正确的问题。

示例实施:

    ObservableList<String> sourcelist;
    ObservableFilteredList<String> filteredlist;

    sourcelist = FXCollections.observableArrayList();
    listview_source.setItems(sourcelist);

    filteredlist = new ObservableFilteredList<String>(sourcelist, s -> s.toUpperCase().startsWith("O"));
    listview_filtered.setItems(filteredlist);

此实施的缺点是什么?

1 个答案:

答案 0 :(得分:1)

是的,它已经实现并被称为FilteredList,您可以使用它来获取它 ObservableList.filtered(Predicate)或者您可以创建自己的FilteredList包裹现有ObservableList +设置正确的Predicate