Я не вижу фундаментальной проблемы в вашем коде Stream.Способ, который вы написали, не очень эффективен и позволяет элементам, совпадающим с несколькими словами, встречаться в списке результатов несколько раз.Возможно, пользовательский интерфейс, для которого вы устанавливаете результат, не может это обработать.
Я бы создал один фильтр из введенного текста, который будет соответствовать, если в элементе появится какое-либо слово, используясопоставление без учета регистра вместо многократного преобразования каждой строки в нижний регистр.Например, с помощью такого вспомогательного метода:
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());