Этот пост посвящен представлению API потоков Java на примере. Он показывает, как вы можете выполнять обработку строк с помощью потоков. Я использую IntelliJ IDEA (выпуск сообщества 2019.2), использую «текстовые блоки» (функция Java 13) и ключевое слово var.

Решаемая задача: сгруппировать слова в предложении по размеру.

Вот программа, которая это делает:

import java.util.Arrays;

import static java.util.stream.Collectors.groupingBy;

class WordsByGroups {
    static String limerick =
            """
            A wonderful bird is the pelican;
            His beak can hold more than his belican.
            He can hold in his beak
            Enough food for a week,
            Though I am damned if I know how the helican!
            """;

    public static void main(String[] args) {
        System.out.println(limerick);
        var words = limerick.toLowerCase()
                            .replaceAll("\\W", "\n")
                            .split("\n");

        var wordsBySize = Arrays.stream(words)
                                .filter(str -> !str.isBlank())
                                .distinct()
                                .sorted()
                                .collect(groupingBy(String::length));

        System.out.println("List of words by its size \n");

        wordsBySize.forEach(
                (size, wordList) -> System.out.printf("Words of length {%d}:{%s}\n", size, wordList)
        );
    }
}

Вот вывод программы:

A wonderful bird is the pelican;
His beak can hold more than his belican.
He can hold in his beak
Enough food for a week,
Though I am damned if I know how the helican!

List of words by its size

Words of length {1}:{[a, i]}
Words of length {2}:{[am, he, if, in, is]}
Words of length {3}:{[can, for, his, how, the]}
Words of length {4}:{[beak, bird, food, hold, know, more, than, week]}
Words of length {6}:{[damned, enough, though]}
Words of length {7}:{[belican, helican, pelican]}
Words of length {9}:{[wonderful]}

Теперь давайте разберемся с программой шаг за шагом.

Начнем с длинной строки (в данном случае лимерика):

A wonderful bird is the pelican;
His beak can hold more than his belican.
He can hold in his beak
Enough food for a week,
Though I am damned if I know how the helican!

Поместим его в «текстовый блок» класса WordsByGroups:

static String limerick =
            """
            A wonderful bird is the pelican;
            His beak can hold more than his belican.
            He can hold in his beak
            Enough food for a week,
            Though I am damned if I know how the helican!
            """;

Теперь в методе main сначала выведем лимерик на консоль:

public static void main(String[] args) {
    System.out.println(limerick);

Пришло время разбить строку на слова — сначала преобразовать в нижний регистр, заменить все несловесные символы ('\W') символами новой строки ('\n') и, наконец, разделить на символы новой строки ('\n'):

var words = limerick.toLowerCase()
                            .replaceAll("\\W", "\n")
                            .split("\n");

Теперь у нас есть список слов в массиве.

Давайте создадим
1. поток массива: Arrays.stream(words)
2. удалим все пустые строки: filter(str -> !str.isBlank())
3. удалим дубликаты : different()
4. отсортировать слова: sorted()
5. собрать слова, сгруппированные по их длине, в карту: collect(groupingBy(String::length));

var wordsBySize = Arrays.stream(words)
                                .filter(str -> !str.isBlank())
                                .distinct()
                                .sorted()
                                .collect(groupingBy(String::length));

Переменная wordsBySize имеет размер слов в качестве ключа и совпадающие слова в качестве значения. Переберите это и распечатайте:

wordsBySize.forEach(
      (size, wordList) -> 
      System.out.printf("Words of length {%d}:{%s}\n", size, wordList)
);

Это все люди! Разве стримы не приносят удовольствия?

Вы можете посмотреть видео на YouTube здесь, чтобы увидеть программирование в действии здесь: https://youtu.be/n2iI-sRtclo