假设您有一个基类型对象列表(在我的例子中为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);
此实施的缺点是什么?
答案 0 :(得分:1)
是的,它已经实现并被称为FilteredList,您可以使用它来获取它
ObservableList.filtered(Predicate)或者您可以创建自己的FilteredList
包裹现有ObservableList
+设置正确的Predicate。