Введение

Добро пожаловать в мир Java-программирования! Java 17, последняя стабильная версия на момент написания статьи, предлагает широкий спектр возможностей, делающих программирование увлекательным и эффективным процессом. В этом посте мы рассмотрим критический аспект программирования на Java — потоки. Если вы новичок, не волнуйтесь, так как мы разобьем все на удобоваримые куски. Итак, давайте углубимся.

Введение в потоки

Потоки — основная функция Java, представленная в Java 8 и усовершенствованная в последующих версиях, включая Java 17. Они предназначены для того, чтобы сделать обработку коллекций более эффективной и выразительной. Поток — это последовательность элементов, полученных из коллекций, массивов или каналов ввода-вывода. Важно отметить, что потоки не изменяют исходную структуру данных; они обеспечивают только вычисленное представление данных.

Создание потоков

В Java вы можете создавать потоки несколькими способами. Вот три распространенных метода:

  • Из коллекции:
List<String> myList = Arrays.asList("Apple", "Banana", "Cherry");
Stream<String> myStream = myList.stream();
  • Из массива:
Integer[] myArray = {1, 2, 3, 4, 5};
Stream<Integer> myStream = Arrays.stream(myArray);
  • Из последовательности объектов:
Stream<String> myStream = Stream.of("Apple", "Banana", "Cherry");

Понимание операций с потоками

Потоковые операции бывают «промежуточными» или «конечными». Промежуточные операции преобразуют поток в другой поток, например операции фильтрации и сопоставления. Они всегда ленивы, что означает, что операция не выполняется до тех пор, пока не будет вызвана терминальная операция в потоке. Терминальные операции производят результат или побочный эффект, например count или forEach.

Промежуточные операции

  • фильтр. Эта операция позволяет удалять элементы в зависимости от условия.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println);