Потоки Java 8 позволяют разработчикам извлекать точные данные из большой коллекции, используя набор предопределенных операций.

До выпуска Java 8 использование термина «поток» в Java автоматически ассоциировалось с вводом-выводом. Однако в Java 8 появился поток, который можно назвать набором вычислительных шагов, связанных вместе в так называемый «конвейер потока».

Эта статья познакомит вас с потоками Java 8 и продемонстрирует, как они могут быть полезны в ваших проектах.

Что такое поток?

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

Как работают потоки

Потоковый конвейер всегда начинается с источника. Тип источника зависит от типа данных, с которыми вы имеете дело, но двумя наиболее популярными из них являются массивы и коллекции.

Чтобы преобразовать коллекцию в исходный поток, вам нужно добавить

instagram viewer
поток() функция к источнику. Это поместит источник в конвейер потока, где будут выполняться несколько различных промежуточных операций (например, фильтр() а также Сортировать()) может работать на нем.

После выполнения всех необходимых промежуточных операций вы можете ввести терминальную операцию (например, для каждого()), который будет производить ранее извлеченные данные из источника.

Жизнь без потоков

Java 8 была выпущена в 2014 году, но до этого разработчикам Java все еще требовалось извлекать специализированные данные из набора общих данных.

Допустим, у вас есть список случайных символов, которые в сочетании со случайными числами образуют уникальные строковые значения, но вам нужны только значения, начинающиеся с символа «C», и вы хотите расположить результат по возрастанию заказывать. Вот как вы извлекаете эти данные без потоков.

Связанный: Что нужно знать об использовании строк в Java

Пример фильтрации и сортировки значений без потоков


импортировать java.util. ArrayList;
импортировать java.util. Массивы;
импортировать java.util. Список;
public class Main {
public static void main (String [] args) {
// объявляем и инициализируем список массивов
Список randomValues ​​= Arrays.asList (
«E11», «D12», «A13», «F14», «C15», «A16»,
«B11», «B12», «C13», «B14», «B15», «B16»,
«F12», «E13», «C11», «C14», «A15», «C16»,
«F11», «C12», «D13», «E14», «D15», «D16»
);
// объявляем, что список массивов будет хранить необходимые значения
Список requiredValues ​​= новый список массивов <> ();
// извлекаем требуемые значения и сохраняем их в reqquiredValues
randomValues.forEach (значение -> {
if (value.startsWith ("C")) {
requiredValues.add (значение);
}
});
// сортируем requiredValues ​​в порядке возрастания
requiredValues.sort ((Строковое значение1, Строковое значение2) -> значение1.compareTo (значение2));
// выводим каждое значение в консоль
requiredValues.forEach ((Строковое значение) -> System.out.println (значение));
}
}

Вам также необходимо объявить и инициализировать список массивов, используете ли вы потоки или какой-либо другой метод извлечения. Если бы вы использовали потоки, вам не нужно было бы ни объявлять новую переменную для хранения требуемых значений, ни создавать остальные пять с лишним строк кода в приведенном выше примере.

Связанный: Как создавать и выполнять операции с массивами в Java

Приведенный выше код дает в консоли следующий вывод:


C11
C12
C13
C14
C15
C16

Жизнь с потоками

В программировании эффективность означает получение того же результата при значительно меньшем количестве кода. Именно это и делает для программиста потоковый конвейер. Поэтому в следующий раз, когда кто-то спросит: «Почему важно использовать потоки в вашем проекте?» Проще говоря: «потоки поддерживают эффективное программирование».

Продолжая наш пример выше, вот как введение потоков трансформирует всю программу.

Фильтрация и сортировка значений на примере потока


импортировать java.util. Массивы;
импортировать java.util. Список;
public class Main {
public static void main (String [] args) {
// объявляем и инициализируем список массивов
Список randomValues ​​= Arrays.asList (
«E11», «D12», «A13», «F14», «C15», «A16»,
«B11», «B12», «C13», «B14», «B15», «B16»,
«F12», «E13», «C11», «C14», «A15», «C16»,
«F11», «C12», «D13», «E14», «D15», «D16»
);
// извлекает только значения, начинающиеся с C, сортирует их и выводит на консоль.
randomValues.stream (). filter (значение-> значение.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

Приведенный выше код демонстрирует, насколько мощным является потоковый интерфейс. Он принимает список случайных значений массива и преобразует его в поток с помощью поток() функция. Затем поток сокращается до списка массивов, который содержит требуемые значения (это все значения, начинающиеся с C), с помощью фильтр() функция.

Как вы можете видеть в приведенном выше примере, C значения располагаются в списке массивов случайным образом. Если бы вы должны были напечатать поток на этом этапе конвейера, значение C15 будет напечатан первым. Следовательно Сортировать() Функция вводится в конвейер потока, чтобы переставить новый массив в порядке возрастания.

Последняя функция в конвейере потока - это для каждого() функция. Это функция терминала, которая используется для остановки конвейера потока и дает следующие результаты в консоли:


C11
C12
C13
C14
C15
C16

Существует обширный список промежуточных операций, которые можно использовать в потоковом конвейере.

Потоковый конвейер всегда начинается с одного источника и поток() функция, и всегда заканчивается одной терминальной операцией (хотя есть несколько разных выберите из.) Но между этими двумя разделами находится список из шести промежуточных операций, которые вы можете использовать.

В нашем примере выше используются только две из этих промежуточных операций.фильтр() а также Сортировать(). Выбранная вами промежуточная операция будет зависеть от задач, которые вы хотите выполнить.

Если бы любое из значений, начинающихся с «C» в нашем списке массивов выше, было в нижнем регистре, и мы выполнили бы те же промежуточные операции с ними, мы бы получили бы следующий результат.

Пример выполнения операций фильтрации и сортировки для значений в нижнем регистре


импортировать java.util. Массивы;
импортировать java.util. Список;
public class Main {
public static void main (String [] args) {
// объявляем и инициализируем список массивов
Список randomValues ​​= Arrays.asList (
«E11», «D12», «A13», «F14», «C15», «A16»,
«B11», «B12», «c13», «B14», «B15», «B16»,
«F12», «E13», «C11», «C14», «A15», «c16»,
«F11», «C12», «D13», «E14», «D15», «D16»
);
// извлекает только значения, начинающиеся с C, сортирует их и выводит на консоль.
randomValues.stream (). filter (значение-> значение.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

Приведенный выше код выдаст в консоли следующие значения:


C11
C12
C14
C15

Единственная проблема с выходными данными выше заключается в том, что они не точно представляют все значения в нашем списке массивов. Хороший способ исправить эту небольшую ошибку - ввести в конвейер потока еще одну промежуточную операцию; эта операция известна как карта() функция.

Использование примера функции карты


импортировать java.util. Массивы;
импортировать java.util. Список;
public class Main {
public static void main (String [] args) {
// объявляем и инициализируем список массивов
Список randomValues ​​= Arrays.asList (
«E11», «D12», «A13», «F14», «C15», «A16»,
«B11», «B12», «c13», «B14», «B15», «B16»,
«F12», «E13», «C11», «C14», «A15», «c16»,
«F11», «C12», «D13», «E14», «D15», «D16»
);
// преобразует все символы нижнего регистра в верхний регистр,
// извлекает только значения, начинающиеся с C, сортирует их и выводит на консоль.
randomValues.stream (). map (String:: toUpperCase) .filter (значение-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

В карта() функция переводит объект из одного состояния в другое; в нашем примере выше он преобразует все символы нижнего регистра в списке массивов в символы верхнего регистра.

Размещение карта() функция непосредственно перед фильтр() функция извлекает все значения, которые начинаются с C из списка массивов.

Приведенный выше код дает в консоли следующий результат, успешно представляющий все значения в списке массивов.


C11
C12
C13
C14
C15
C16

Остальные три промежуточные операции, которые вы можете использовать в своих приложениях, включают:

  • заглянуть ()
  • предел ()
  • пропускать()

Потоки Java 8 упрощают создание эффективного кода

С помощью потоков Java 8 вы можете извлекать дополнительные конкретные релевантные данные из большого источника с помощью одной строчки кода. Пока вы включаете начальный поток() функция и оператор терминала, вы можете использовать любую комбинацию промежуточных операций, которые обеспечивают подходящие результаты для вашей цели.

Если вас интересует строка кода, заключенная в фильтр() функция; это известно как «лямбда-выражение». Лямбда-выражения - еще одна функция, представленная в Java 8, и в ней есть много самородков, которые могут оказаться полезными.

Электронное письмо
Краткое введение в лямбды Java 8

Если вы программист на Java и хотите узнать больше о лямбда-выражениях Java 8, в этой статье мы более подробно рассмотрим синтаксис и использование лямбда-выражений.

Читать далее

Похожие темы
  • Программирование
  • Ява
  • Учебники по кодированию
Об авторе
Кадейша Кин (Опубликовано 13 статей)

Кадейша Кин (Kadeisha Kean) - разработчик программного обеспечения полного стека и автор технических / технологических писателей. У нее отличная способность упрощать некоторые из самых сложных технологических концепций; производство материала, понятного любому новичку в технологии. Она увлечена писательством, разработкой интересного программного обеспечения и путешествиями по миру (с помощью документальных фильмов).

Ещё от Kadeisha Kean

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!

Еще один шаг…!

Пожалуйста, подтвердите свой адрес электронной почты в электронном письме, которое мы вам только что отправили.

.