Рубрики
Без рубрики

Java 8 Streams: Прекратите использовать ‘for’, и упростить ваш код!

Потоки Java 8 и оставляют ваш код более читаемым и лаконичным, кроме того, они аум… С тегами java, java8, programacao funcional, stream.

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

Традиционные петли

Перебирать Collection до Java 5 был код уродливый и комплекса , что всегда увеличивает шанс создать баг неожиданный. Помнить:

List lista = 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 , что уменьшило сложность перебора коллекций:

List lista = 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 принес создания лямбда-функции. Если вы еще не знакомы с ними, вы можете узнать больше, нажав здесь . С этим можно было создать способ перебора коллекции, которая более простой , краткие и еще читается . Вот простой пример, который делает то же то, что в двух предыдущих примерах:

List lista = 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, отличный

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

List lista = 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:

List lista = 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 . См.ниже.

List lista = 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 :

List lista = 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 :

List lista = 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 возвращает сколько элементы остаются нет потока:

List lista = 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() :

List lista = 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 , использовать коллекционера Коллекционеров.Группировка по(...) :

List lista = 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 несколько строк есть только:

List lista = 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”