我不太确定如何表达这个问题,请耐心等待。

我有一个用户定义对象的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;
}

最佳答案

如果您只是想创建原始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(已在列表中)的名称更改时更新它,则需要做两件事:


使PartpartName公开为Observable,例如StringProperty
通过ObservableListobservableArrayList(Callback)用提取器构造原始的observableList(List,Callback)


使用提取器的示例:

ObservableList<Part> parts = FXCollections.observableArrayList(
        part -> new Observable[]{part.partNameProperty()});


CallbackCallback<E, Observable[]>

关于java - ObservableList返回匹配的子列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53075175/

10-09 06:19