Что такое потоки? 🌊
Потоки были введены в Java 8. Согласно документам Oracle, это:
Классы для поддержки операций функционального стиля с потоками элементов, таких как преобразования mapreduce в коллекциях
Давайте выразимся более практично: поток состоит из источника данных, за которым следует ноль или более промежуточных операций, а затем терминальная операция .
Какие источники данных? 🗃
- Коллекции, списки, наборы, целые, длинные, двойные, массивы, строки файла.
какие промежуточные операции?🪓
- фильтровать, сопоставлять, сортировать и т.д.
- Эти операции возвращают поток, поэтому их можно связать с другими операциями.
Какие терминальные операции? ⚒
- Искать, собирать, уменьшать, находить первым и т. Д.
- Они возвращают пустой или непотоковый результат.
- Если в потоке нет терминальной операции, промежуточные операции вызываться не будут.
Давайте преобразуем функцию из императивного в декларативный стиль, используя потоки
Императивная функция (Без потоков) 🦨
private int getResult_imperative(Liststrings) { 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(Liststrings){ 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”