Самое простое решение будет
Set<String> resultSet = phraseSet.stream()
.filter(s -> wordSet.containsAll(Arrays.asList(s.split("\\s+"))))
.collect(Collectors.toSet());
Вы можете превратить это в параллельную обработку, заменив stream()
на parallelStream()
, но вам потребуется довольно большой набор входных данных, чтобы получить выгоду от параллельной обработки.
Обратите внимание, что это простое решение может выполнять ненужную работу, если у вас много несоответствующих фраз, поскольку оно создаст все подстроки перед проверкой, содержатся ли они в wordSet
. Решение типа Flown будет откладывать создание подстрок, поэтому его можно пропустить при обнаружении слова, не содержащегося в wordSet
(также известного как короткое замыкание). Еще одним улучшением производительности было бы перемещение создания Pattern
из обработки потока и его повторное использование (Pattern
также создается за сценой при использовании метода, подобного String.split
, как в приведенном выше решении).
Pattern whiteSpace = Pattern.compile("\\s+");
Predicate<String> inWordSet = wordSet::contains;
Set<String> resultSet = phraseSet.stream()
.filter(phrase -> whiteSpace.splitAsStream(phrase).allMatch(inWordSet))
.collect(Collectors.toSet());