Этот пост посвящен представлению 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