Работа со стримами в Java 8: поиск индексов по условию
Быстрый ответ
Java SE 8 не предусматривает встроенной поддержки для пар или кортежей. Однако возможно использовать класс AbstractMap.SimpleEntry
для создания пар:
Map.Entry<String, Integer> пара = new AbstractMap.SimpleEntry<>("яблоко", 10);
Для получения доступа к элементам пары используйте методы пара.getKey()
и пара.getValue()
. Чтобы работать с кортежами, содержащими больше двух элементов, можно использовать внешние библиотеки или определить собственный класс.
Альтернатива в виде пары из JavaFX
При использовании JavaFX можно применить класс javafx.util.Pair
в своем проекте:
Pair<Integer, String> пара = new Pair<>(1, "яблоко");
Однако следует быть внимательными: введение JavaFX исключительно ради работы с парами может неоправданно усложнить проект.
Решение с помощью AbstractMap
AbstractMap.SimpleEntry
и SimpleImmutableEntry
могут работать как аналоги пар в Java 8:
Map.Entry<Integer, String> мутабельнаяПара = new AbstractMap.SimpleEntry<>(1, "яблоко");
Map.Entry<Integer, String> иммутабельнаяПара = new AbstractMap.SimpleImmutableEntry<>(1, "яблоко");
Эти классы присутствуют в стандартном комплекте Java и подходят для хранения пар ключ-значение.
Применение Stream для работы с массивами
Индексы в итеративном просмотре
Для обхода индексов массивов применяйте IntStream.range
:
IntStream.range(0, array.length)
.forEach(index -> {
// здесь происходит обработка array[index] и дальнейшие "индексированные" вычисления 😉
});
Использование Streams и лямбда-выражений позволяет сократить и упростить код циклов.
Эффективное создание коллекций
Для создания коллекций из потоков данных используйте toList()
:
List<String> список = Stream.of("яблоко", "банан", "вишня")
.collect(Collectors.toList());
Такой подход улучшает оптимизацию сборки данных и упрощает восприятие кода.
Расширенные возможности
Использование Map.entry в Java 9
Уже в Java 9 метод Map.entry
представляет собой удобный способ создания пар:
Map.Entry<String, Integer> запись = Map.entry("яблоко", 10);
Это позволяет сократить код и минимизировать ошибки связанные с null-значениями.
Использование Record в Java 14
С появлением JDK 14 классы Record предложили информативный способ определения кортежей:
record Pair<K, V>(K key, V value) { }
Pair<String, Integer> пара = new Pair<>("яблоко", 10);
Records упрощают создание типобезопасных и неизменяемых кортежей.
Библиотеки и применяемые техники
Библиотека Apache Common Lang
Apache Commons Lang предлагает удобные классы для работы с кортежами:
Pair<String, Integer> пара = Pair.of("яблоко", 10);
Triple<String, Integer, Double> тройка = Triple.of("яблоко", 10, 15.0);
API этих классов просто и наглядно, легко применимо в коде.
Подходы функционального программирования
Java SE 8 открывает новые возможности для функционального программирования:
list.stream()
.filter(s -> s.contains("a"))
.forEach(System.out::println);
Лямбда-выражения и потоки улучшают выразительность и читаемость кода.
Визуализация
Код можно ассоциировать с кондуктором блоков LEGO (🧱):
- Используйте отдельные блоки (🟥) в качестве отдельных переменных.
- Для создания пар или кортежей в Java SE 8 необходимо найти или создать «двойные детали» (🚫🧱🧱).
Дополнительные приемы для сложного кодирования
Применение параллельных потоков
Параллельные потоки возможно использовать для обработки больших объемов данных:
array.parallelStream()
.filter(...)
.forEach(...);
Не забывайте проверять, улучшают ли они производительность, потому что из-за накладных расходов скорость выполнения может не увеличиться.
Создание пользовательских классов для кортежей
Создание пользовательских классов рекомендуется, когда требуется функциональность кортежей больше, чем просто пары:
public class Trio<K, V, T> {
public K первый;
public V второй;
public T третий;
public Trio(K первый, V второй, T третий) {
this.первый = первый;
this.второй = второй;
this.третий = третий;
}
// Используйте геттеры и сеттеры для доступа к переменным ...
}
Такие классы позволяют полноценно контролировать структуру и поведение кортежей.
Полезные материалы
- Pair (JavaFX 8) – документация к классу Pair из JavaFX.
- Using Pairs or 2-tuples in Java – Stack Overflow – обсуждение использования пар и кортежей в Java на Stack Overflow.
- org.apache.commons.lang3.tuple (Apache Commons Lang 3.14.0 API) – документация к кортежам из библиотеки Apache Commons Lang.
- GitHub – javatuples/javatuples: Typesafe representation of tuples in Java – открытый исходный код библиотеки для кортежей в Java.
- Java 8 – The Bad Parts – Medium – статья о слабых сторонах Java 8, включая отсутствие поддержки кортежей.