Java 8 Stream debug
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8.
В этой статье мы рассмотрим отладку(debug) Stream-ов в Java 8
1. Введение
Stream API - новый способ взаимодействия с данными, представляя их в виде конечного потока данных.
Отладка Stream-ов на первый взгляд простая, поскольку у нас есть несколько методов, которые можно использовать для отладки кода, но не все они являются оптимальным выбором. Методы для отладки не должны изменять Stream каким либо образом. Про них мы сегодня и поговорим.
2. Debug stream with map
Stream API позволяет нам использовать метод map() для "подглядывания" за данными. Выглядеть это будет следующим образом
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .map(n -> debug(n)) .forEach(n -> doSomeStaff(n)); } |
Где метод debug() объявлен как
1 2 3 4 |
private static Integer debug(Integer n) { System.out.println(n); return n; } |
И метод doSomeStaff()
1 2 3 |
private static void doSomeStaff(Integer n) { } |
который "что-то делает" с данными.
Такой подход рабочий, мы увидим в терминале последовательность от 1 до 5, при этом мы выполнили условие, мы не изменили Stream. Но все же подход не самый оптимальный, нам все же приходится возвращать данные в return
3.Debug stream with filter
Следующий кандидат - filter
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .filter(n -> debug(n)) .forEach(n -> doSomeStaff(n)); } |
Где метод debug() выглядит так
1 2 3 4 |
private static boolean debug(Integer n) { System.out.println(n); return true; } |
А метод doSomeStaff() все такой же полезный 🙂
Такой подход так же рабочий и последовательность появится в терминале. Но все же подход не оптимальный, мы можем попросту вместо true случайно вернуть false и таким образом завести себе новый баг.
4.Debug stream with peek
Последним кандидатом на роль метода для отладки есть peek(). Метод peek() принимает лямбда-выражение известное как потребитель (Consumer). Его задача просто принять входящий параметр, а вот возвращать значение уже не обязан.
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .peek(n -> debug(n)) .forEach(n -> doSomeStaff(n)); } |
Где метод debug()
1 2 3 |
private static void debug(Integer n) { System.out.println(n); } |
Теперь стало возможным даже избавиться от метода debug() и использовать ссылку на метод
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .peek(System.out::println) .forEach(n -> doSomeStaff(n)); } |
Использование метода peek() является лучшим вариантом для отладки Stream-ов, о чем так же говорится в документации метода peek() "@apiNote This method exists mainly to support debugging".
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Детальную информацию Вы можете найти у нас на сайте.