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)
)
)
添加回答
举报
