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

Улучшайте Свой Java-Код С Помощью Потоков

Что такое потоки? 🌊 Потоки были введены в Java 8. Согласно документам Oracle, это: C… С пометкой java, веб-разработчик, программирование, учебник.

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

Потоки были введены в Java 8. Согласно документам Oracle, это:

Классы для поддержки операций функционального стиля с потоками элементов, таких как преобразования mapreduce в коллекциях

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

Какие источники данных? 🗃

  • Коллекции, списки, наборы, целые, длинные, двойные, массивы, строки файла.

какие промежуточные операции?🪓

  • фильтровать, сопоставлять, сортировать и т.д.
  • Эти операции возвращают поток, поэтому их можно связать с другими операциями.

Какие терминальные операции? ⚒

  • Искать, собирать, уменьшать, находить первым и т. Д.
  • Они возвращают пустой или непотоковый результат.
  • Если в потоке нет терминальной операции, промежуточные операции вызываться не будут.

Давайте преобразуем функцию из императивного в декларативный стиль, используя потоки

Императивная функция (Без потоков) 🦨

private int getResult_imperative(List strings) {  
    int result = 0;  
    for (String string : strings){  
        if(isDigit(string.charAt(0))) continue;  
        if (string.contains("_")) continue;  
        result += string.length();  
    }  
    return result;  
}

Мы замечаем, что нам вручную нужно сделать пару вещей 😤

  • Объявите переменную результата, чтобы отслеживать результат
  • Перебирайте струны
  • Напишите два оператора if (которые могут быть намного сложнее, чем в этом случае)
  • Добавьте длину каждого из них к результату

Давайте проверим декларативный стиль (потоки) 🤩

private int getResult_Declarative(List strings){  
    return strings.  
            stream().  
            filter(s -> !isDigit(s.charAt(0))).  
            filter(s -> !s.contains("_")).  
            mapToInt(String::length).  
            sum();  
}

Итак, в чем же разница? 👀

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

🧠 Замечания

Разве второй подход не казался более простым? Мы указали что мы хотели, а не как мы хотим это сделать . Таков дух декларативного программирования и назначение Stream API в современных приложениях Java.

Вот отличный источник для получения более подробной информации о потоках на Java.

Оригинал: “https://dev.to/jarjanazy/improve-your-java-code-using-streams-lif”