Потоки Java 8 и оставляют ваш код более читаемый и сжатый , и могут увеличить его производительность при работе с списки и коллекции. Узнайте прямо сейчас, и увеличьте качества ваш код!
Традиционные петли
Перебирать Collection
до Java 5 был код уродливый и комплекса , что всегда увеличивает шанс создать баг неожиданный. Помнить:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 6, 3, 2, 1, 8, 5, 7, 4); for (Iterator numero = lista.iterator(); numero.hasNext();) { Integer integer = numero.next(); System.out.print(integer); }
К счастью, начиная с Java 5 был создан новый синтаксис For-Each , что уменьшило сложность перебора коллекций:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 6, 3, 2, 1, 8, 5, 7, 4); for (Integer numero : lista) { System.out.print(numero); }
Несмотря на то, что новый синтаксис ослабили жизнь разработчиков java, она еще не воспользовались функционального программирования, и это сильно императив . В Java 8 это изменилось полностью .
Потоки делают Java 8
Java 8 принес создания лямбда-функции. Если вы еще не знакомы с ними, вы можете узнать больше, нажав здесь . С этим можно было создать способ перебора коллекции, которая более простой , краткие и еще читается . Вот простой пример, который делает то же то, что в двух предыдущих примерах:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 6, 3, 2, 1, 8, 5, 7, 4); lista.stream().forEach(System.out::print);
Этот синтаксис создает поток /данных. В этом случае данные являются цифры. Для каждого одним из них является вызов функции System.out.print(...)
пройдя в номер в качестве параметра. Здесь мы также с помощью syntace method reference , query эту форму ссылка на метод: System.out::печать
.
Operações intermediárias em Streams делают Java 8
Метод forEach
, которые мы используем, выше операции окончательный или терминал , потому что после него больше ничего не может быть сделано. Но вы можете сделать гораздо больше с Streams Java 8. Давайте теперь посмотрим, примеры посреднических операций .
Методы skip , предел e, отличный
Давайте посмотрим на пример ниже, который фильтрует некоторые результаты, прежде чем обращаться в них.
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); lista.stream() .skip(2) // ignora os dois primeiros números .limit(9) // limita a 9 números .distinct() // ignora números iguais .forEach(System.out::print);
Выполнение этого кода дает следующий вывод в консоли:
8742315
В данном примере сделаны несколько операций перед выполнения forEach:
-
Skip
служит для пропуска первые X элементов. Здесь мы игнорируем 1 и 5. -
Лимит
показывает, сколько объектов вы хотите обработать от того, в ближайшие игнорируются. Здесь мы взяли 8 на 5. - O
отчетливый
индивидуальный ао
ОТЧЕТЛИВЫЙSQL: он сохраняет только те результаты, которые отличаются друг от друга. Для этого он использует метод
equals
Метод filter
3 функции, которые показали выше, “фильтрует” поток”, то есть, игнорировать некоторые элементы. Но и в случае необходимости фильтр подгонянный ? Для этого используется метод filter:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); lista.stream() .filter(e -> e % 2 == 0) // mantém apenas números pares .forEach(System.out::print); // imprime todos no console
Фрагмент выше код производит следующий вывод в консоли:
842284
Обратите внимание, что метод filter
, в этом случае фильтрация наш поток, чтобы сохранить всего четные. Если вы еще не знакомы с функциями, лямбда, структуры заключается в следующем:
Структура лямбда-функция, передаваемая в метод filter
Метод map
В случае необходимости внесения преобразования данные, прежде чем передавать его на следующий метод stream, используется метод, map
. Несмотря на название, он не имеет отношения интерфейс Map
. См.ниже.
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); lista.stream() .map(e -> e * 2) // multiplica cada item por 2 .forEach(e -> System.out.print(e + " ")); // imprime todos no console
Выход в консоли следующее:
2 10 16 14 8 4 6 4 2 16 10 14 8
Обратите внимание, что все цифры умножаются на 2, прежде чем они будут отображаться в консоли. Однако, важно отметить, что цифры в первоначальный список не были изменены . То есть, преобразования, метод map
влияют не только значения, которые будут переданы на фронт то stream. Это удобно, так как не всегда возможно в идеале, мы будем работать с ценностями и экземпляров неизменяемые .
Операции окончательного Потоки Java 8
Все примеры, представленные до сих пор поток завершается forEach
. Это одна из операций окончательный disponíveis на API потоков делает Java 8. То есть, это метод, который закрывает поток и собирает в результате все, что было сделано. Мы сейчас увидим, и другие операций конечных что, как правило, более полезны, чем forEach
. В конце концов, вы, вероятно, хотите сохранить результат от операций на поток, и использовать этот результат, чтобы что-то. Давайте рассмотрим некоторые возможности.
Методы, max, min, count
Если вы хотите забрать или меньше значение после операций, осуществляемых в свой поток, методы max
мин
делают именно это. Давайте посмотрим, max
:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); Optional maiorNumero = lista.stream() .map(e -> e * 2) // multiplica cada item por 2 .max(Comparator.naturalOrder()); // pega o maior item pela ordem natural System.out.println(maiorNumero.get());
При использовании метода max
необходимо сообщить, как поток будет сравнения объектов. В этом корсо, как Integer
уже реализует интерфейс Ее
и метод compareTo
, он уже есть естественный порядок , которые мы можем использовать, поэтому используем Comparator.naturalOrder()
. В этом примере номер 16
печатается в консоли, так как это количество в поток после того, как мы все умножается на 2. Смотрите, что, по операции end необходимо сохранить результат в переменную, чтобы использовать его. То же самое происходит с методом min :
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); Optional menorNumero = lista.stream() .map(e -> e * 2) // multiplica cada item por 2 .min(Comparator.naturalOrder()); // pega o menor item pela ordem natural System.out.println(menorNumero.get());
Следуя той же идее метода max
этот пример дает результат 2
в консоли.
Наконец, метод count
возвращает сколько элементы остаются нет потока:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); Long quantidade = lista.stream() .filter(e -> e % 2 == 0) // mantém apenas números pares .count(); // pega quantos itens restam no stream System.out.println(quantidade);
В этом примере вывод в консоли будет 6
, что это количество чисел, пар в поток.
Метод сбора данных
И завершает примеры основных операций, у нас есть метод collect
. Он самый настраиваемый сбора результатов от операций на Stream. За многочисленные форм использоваться, я расскажу подробнее о он в определенной статье. Чтобы узнать, так что я делить , это просто следовать за мной, все ссылки находятся в конце в этой статье. Пока давайте посмотрим на некоторые основные примеры с collect.
Se você quiser apenas coletar o resultado em uma новый список , используйте um collector pré-implementado em Коллекторы.ToList()
:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); List novaLista = lista.stream() .filter(e -> e % 2 == 0) // mantém apenas números pares .map(e -> e * 2) // multiplica cada item por 2 .collect(Collectors.toList()); // coleta todos os itens em uma nova lista System.out.println(novaLista);
В этом примере фильтрации только четные числа, умножим все по 2 и собираем результат в новый список. Вывод в консоль:
[16, 8, 4, 4, 16, 8]
Caso queira agrupar os itens da lista em um mapa , использовать коллекционера Коллекционеров.Группировка по(...)
:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); Map > mapa = lista.stream() .map(e -> e * 2) // multiplica cada item por 2 .collect(Collectors.groupingBy(e -> e > 8)); // agrupa itens baseado no resultado da comparação System.out.println(mapa);
В этом примере мы умножения все элементы stream 2, а затем собираем в цифрах крупнейших 8 меньше или равно 8. Посмотрите, как сидит карты при печати в консоли:
{false=[2, 8, 4, 6, 4, 2, 8], true=[10, 16, 14, 16, 10, 14]}
E casa quero gerar uma unica string часть потока, часть использования коллектора Коллекторы.присоединение(...)
, , une несколько строк есть только:
Listlista = Arrays.asList(1, 5, 8, 7, 4, 2, 3, 2, 1, 8, 5, 7, 4); String stringUnica = lista.stream() .map(String::valueOf) // transforma cada item em String .collect(Collectors.joining(";")); // junta todas as Strings em uma única separada por ';' System.out.println(stringUnica);
Здесь меняем каждое число в строку, используя String.valueOf(…). После собираем все в одну строку, разделив элементы по точка с запятой . Вывод в консоль следующую строку:
1;5;8;7;4;2;3;2;1;8;5;7;4
Остановка использовать ‘for’ и ‘while’
Используя Потоки Java 8, редко будет необходимо, что вы делаете цикл явный опять, как ,
while
или ...while
. API streams использует циклы неявные , использует преимущества функциональное программирование , и оставляет гораздо больше кода читаемый и сжатый . Кроме того, в следующей статье я покажу, как вы можете параллельно выполнение stream, очень простой !
Несмотря на то, что условия представленного streams только из списки можно создать их различных других форм! Увидеть:
- Array с помощью
Массивы.поток(объект[])
; - De métodos estaticos em classes de stream , com
Stream.of(Object[])
,IntStream.range(int, int)
; - Как линхас de um arquivo podem ser obtidas com
BufferedReader.lines()
; - Потоки | файлы | могут быть получены через методы класса Филе
;
Потоки - случайных чисел могут быть получены в Random.int()
.
Поздравления ! Agora você conhece melhora API de Потоки делают Java 8 ! Вы можете использовать esse conheciento для |/доставки// в перспективе решения высокое качество .
Хотите понять немного больше о функциях lambda и его структура ? См. эту статью, чтобы понять, легко структура лямбда-функции.
Хотите получать мои лучшие советы для написания кода, высокое качество и доставки проектов в срок? Потом перейдите сюда .
Хотите узнать, как улучшить свой код каждый день? Тогда последует в twitter : в
А вы? Уже пришлось дать техническое обслуживание в какой-то код с streams ? Помнит ситуации, в которых вы мог бы использовать потоки? Пусть комментарий !
Понравилось, что узнали? Поделитесь с другими разработчиками в WhatsApp и в социальных сетях!
Post Java 8 Streams: Прекратите использовать ‘for’, и упростить ваш код! появился первый в ринальдо.dev .
Оригинал: “https://dev.to/rinaldodev/java-8-streams-pare-de-usar-for-e-simplifique-seu-codigo-4df8”