Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 维护过滤的可观察列表最基本的方法是什么?_Java_Collections_Javafx - Fatal编程技术网

Java 维护过滤的可观察列表最基本的方法是什么?

Java 维护过滤的可观察列表最基本的方法是什么?,java,collections,javafx,Java,Collections,Javafx,假设您有一个基本类型的对象列表(在我的例子中是,NotebookEntry),该列表包含各种后代类型的对象(如NotebookEntryPlainText)。此主列表由笔记本管理器维护,但各种控件需要从主列表创建自己的筛选列表,例如,仅纯文本条目。这些列表必须包括主列表中所有适用的条目,但如果从主列表中删除条目,则这些列表不得包含该条目 我提出了一个扩展ListBinding的绑定,它避免了实现任何监听器。装订是单向的 代码非常简单: public class ObservableFiltere

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

我提出了一个扩展
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())
                );
    }
}
公共类ObservableFilteredList扩展ListBinding
{
私人最终观察者总名单;
私有最终谓词;
公共ObservableFilteredList(ObservableList _masterlist,谓词_p)
{
主列表=_主列表;
谓词=_p;
超级绑定(主列表);
}
@凌驾
公共空间处置()
{
super.unbind(主列表);
}
@凌驾
受保护的可观察列表计算值()
{
返回FXCollections.observableList(
masterlist.parallelStream()
.filter(谓词)
.collect(收集器.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);
observeListSourceList;
ObservableFilteredList filteredlist;
sourcelist=FXCollections.observableArrayList();
listview_source.setItems(sourcelist);
filteredlist=新的ObservableFilteredList(sourcelist,s->s.toUpperCase().StartWith(“O”);
listview_filtered.setItems(filteredlist);

此实现的缺点是什么?

是的,它已经实现了,称为,您可以使用
或者,您可以创建自己的
FilteredList
包装现有的
observeList
+设置正确。

它一直在上下文菜单中盯着我看。