2 回答

TA貢獻1811條經驗 獲得超4個贊
我在您的 Stream 代碼中看不到根本問題。您編寫的方式不是很有效,它允許匹配多個單詞的元素在結果列表中多次出現。也許,您設置結果的 UI 無法處理這個問題。
我將從輸入的文本中創建一個過濾器,如果元素中出現任何單詞,它將匹配,使用不區分大小寫的匹配,而不是將每個字符串重復轉換為小寫。例如,使用這樣的實用方法:
static final Pattern SPACE = Pattern.compile("\\s+");
public static <T> Predicate<T> getFilter(Function<? super T, String> f, String words) {
String regex = SPACE.splitAsStream(words)
.map(Pattern::quote).collect(Collectors.joining("|"));
Predicate<String> sp = Pattern.compile(regex, Pattern.CASE_INSENSITIVE).asPredicate();
return t -> sp.test(f.apply(t));
}
可以用作
List<Products_Data> filteredList = productList.stream()
.filter(getFilter(Products_Data::getPartDesc, searchField.getText()))
.collect(Collectors.toList());

TA貢獻1982條經驗 獲得超2個贊
你的匹配核心應該是這樣的:
productList.stream().filter(
product -> searchableWords.stream().allMatch(
searchWord -> product.getPartDesc().toLowerCase().contains(searchWord)
)
)
添加回答
舉報