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

Отладка потоков Java 8 с помощью IntelliJ

Узнайте о выделенной функции отладки потока IntelliJ на нескольких простых примерах

Автор оригинала: Martin van Wingerden.

1. введение

С момента появления Java 8 многие люди начали использовать (новую) функциональность потока. Конечно, бывают моменты, когда наши потоковые операции работают не так, как ожидалось.

IntelliJ имеет, помимо обычных параметров отладки , специальную функцию отладки потока. В этом коротком уроке мы рассмотрим эту замечательную функцию.

2. Диалоговое окно Трассировки Потока

Давайте начнем с того, как открыть диалоговое окно Трассировки потока. На панели инструментов окна отладки есть значок Трассировка текущей цепочки потоков, который включается только тогда, когда наше приложение останавливается на точке останова внутри вызова API потока :

Щелчок по значку откроет диалоговое окно Трассировки потока.

Диалог имеет два режима. В первом примере мы рассмотрим плоский режим. А во втором примере мы покажем режим по умолчанию-режим разделения.

3. Примеры

Теперь, когда мы представили функциональность потоковой отладки в IntelliJ, пришло время поработать с некоторыми примерами кода.

3.1. Базовый пример с отсортированным потоком

Давайте начнем с простого фрагмента кода, чтобы привыкнуть к диалоговому окну трассировки потока:

int[] listOutputSorted = IntStream.of(-3, 10, -4, 1, 3)
  .sorted()
  .toArray();

Первоначально. у нас есть поток неупорядоченных int . Затем мы сортируем этот поток и преобразуем его в массив.

Когда мы просматриваем трассировку потока в плоском режиме , она показывает нам обзор выполняемых шагов:

В дальнем левом углу мы видим начальный поток. Он содержит int s в том порядке, в котором мы их написали.

Первый набор стрелок показывает нам новое расположение всех элементов после сортировки. А в дальнем правом углу мы видим наш выход. Все элементы появляются там в отсортированном порядке.

Теперь, когда мы увидели основы, пришло время для более сложного примера.

3.2. Пример использования flatMap и фильтра

В следующем примере используется flatMap . Stream.flatMap помогает нам, например, преобразовать список Необязательных s в обычный список. В следующем примере мы начнем со списка Необязательных | Клиентов s. Затем мы сопоставляем его со списком Customer s и применяем некоторую фильтрацию:

List> customers = Arrays.asList(
    Optional.of(new Customer("John P.", 15)),
    Optional.of(new Customer("Sarah M.", 78)),
    Optional.empty(),
    Optional.of(new Customer("Mary T.", 20)),
    Optional.empty(),
    Optional.of(new Customer("Florian G.", 89)),
    Optional.empty()
);

long numberOf65PlusCustomers = customers
  .stream()
  .flatMap(c -> c
    .map(Stream::of)
    .orElseGet(Stream::empty))
  .mapToInt(Customer::getAge)
  .filter(c -> c > 65)
  .count();

Затем давайте рассмотрим трассировку потока в режиме разделения, что дает нам лучший обзор этого потока.

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

После этого мы сопоставляем наш поток клиентов с их возрастом:

Следующий шаг фильтрует наш поток возрастов к потоку возрастов больше 65:

Наконец, мы подсчитываем количество предметов в нашем потоке веков:

4. Предостережения

В приведенных выше примерах мы видели некоторые возможности, предлагаемые диалогом Трассировки потока. Однако есть некоторые важные детали, о которых следует знать. Большинство из них являются прямым следствием того, как работают потоки.

Во-первых, потокам всегда нужны терминальные операции для выполнения . Это ничем не отличается при использовании диалогового окна Трассировки потока. Кроме того, мы должны знать об операциях, которые не потребляют весь поток — например, anyMatch . В этом случае он не будет показывать все элементы — только те элементы, которые обрабатываются.

Во-вторых, имейте в виду, что поток будет потреблен . Если мы объявим Поток отдельно от его операций, мы можем столкнуться с ошибкой “Поток уже был обработан или закрыт” . Мы можем предотвратить эту ошибку, присоединив объявление потока к его использованию.

5. Заключение

В этом кратком руководстве мы рассмотрели, как использовать диалог трассировки потока IntelliJ.

Сначала мы рассмотрели простой случай, показывающий сортировку и сбор. Затем мы рассмотрели более сложный сценарий, включающий плоское отображение, отображение, фильтрацию и подсчет.

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

Как всегда, полный исходный код статьи доступен на GitHub .