我不太确定如何表达这个问题,所以请耐心等待。
我有一个ObservableList
个用户定义的对象,带有一些getter方法,例如:
public String getName() { return this.name; }
public int getId() { return this.id; }
我想做的是能够通过搜索子字符串从我的主要可观察列表中返回一个子列表。因此,如果我有一些包含这些名称的类:
car
carrol
castro
bret
我将如何获取所有对象的ObservableList<MyClass>
,其中getName()
检索到的name参数包含“ ca”子字符串,如下所示:
car
carrol
castro
或“汽车”的子字符串,例如:
car
carrol
到目前为止,这是我的方法:
public ObservableList<Part> searchBySubstring(String sub, ObservableList<Part> full){
ObservableList<Part> newParts = FXCollections.observableArrayList();
for(int i = 0; i < full.size(); i++){
if(full.get(i).getPartName().contains(sub))
newParts.add(full.get(i));
}
return newParts;
}
答案 0 :(得分:3)
如果您只是想为原始ObservableList
创建一个“快照”,那么您已经在做的是这样做的方法。您可以更改代码以使用for-each循环或流,但是我想这更多是一种样式选择。
每次循环:
ObservableList<Part> search(String sub, ObservableList<Part> full) {
ObservableList<Part> result = FXCollections.observableArrayList();
for (Part part : full) {
if (part.getPartName().contains(sub)) {
result.add(part);
}
}
return result;
}
流:
ObservableList<Part> search(String sub, ObservableList<Part> full) {
return full.stream()
.filter(part -> part.getPartName().contains(sub))
.collect(Collectors.toCollection(FXCollections::observableArrayList));
}
但是,如果您希望ObservableList
随着原始ObservableList
的更改而更新,请使用FilteredList
。在这种情况下,只需创建一次FilteredList
并根据需要更新Predicate
。
String sub = ...;
ObservableList<Part> full = ...;
FilteredList<Part> filtered = full.filtered(part -> part.getPartName().contains(sub));
// or use new FilteredList<>(...);
// Then, to "re-search" the list...
String newSub = ...;
filtered.setPredicate(part -> part.getPartName().contains(newSub));
FilteredList
将随着原始ObservableList
中元素的添加和删除而更新。如果要在Part
(已经在列表中)的名称更改时更新它,则需要做两件事:
Part
暴露为partName
,例如Observable
。{li1}。observableArrayList(Callback)
或observableList(List,Callback)
用提取器构造原始StringProperty
。使用提取器的示例:
ObservableList
ObservableList<Part> parts = FXCollections.observableArrayList(
part -> new Observable[]{part.partNameProperty()});
是Callback
。