Разделить список слов, используя потоки в Java - PullRequest
0 голосов
/ 03 марта 2019

У меня есть этот метод, который принимает несколько списков, которые содержат строки книг.Я объединяю их в поток, чтобы затем перебрать их, чтобы разделить на все не-буквенные \\P{L}.

Есть ли способ избежать цикла for-each и обработать его в потоке?

private List<String> getWordList(List<String>... lists) {
        List<String> wordList = new ArrayList<>();

        Stream<String> combinedStream = Stream.of(lists)
                .flatMap(Collection::stream);
        List<String> combinedLists = combinedStream.collect(Collectors.toList());

        for (String line: combinedLists) {
            wordList.addAll(Arrays.asList(line.split("\\P{L}")));
        }

        return wordList;
}

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Вы можете объединить весь список и flatMap для результата

private List<String> getWordList(List<String>... lists) {
    return Stream.of(lists)
    .flatMap(Collection::stream)
    .flatMap(str -> Arrays.stream(str.split("\\P{L}")))
    .collect(Collectors.toList());
}
0 голосов
/ 03 марта 2019

Вам не нужно вводить так много переменных:

private List<String> getWordList(List<String>... lists) {

    return Stream.of(lists) // Stream<Stream<String>>
                 .flatMap(Collection::stream) // Stream<String> 
                 .flatMap(Pattern.compile("\\P{L}")::splitAsStream) //Stream<String>     
                 .collect(toList()); // List<String>
}

Как подчеркнул Хольгер, .flatMap(Pattern.compile("\\P{L}")::splitAsStream)
следует отдавать предпочтение перед .flatMap(s -> Arrays.stream(s.split("\\P{L}"))), чтобы сэкономить выделение массива и выполнить компиляцию шаблона длякаждый элемент потока.

0 голосов
/ 03 марта 2019

Имея поток, вы можете просто "flatMap" далее и вернуть результат:

return combinedStream
        .flatMap(str -> Arrays.stream(str.split("\\P{L}")))
        .collect(Collectors.toList());

В целом:

private List<String> getWordList(List<String>... lists) {
    return Stream.of(lists)
        .flatMap(Collection::stream)
        .flatMap(str -> Arrays.stream(str.split("\\P{L}")))
        .collect(Collectors.toList());
}
...