1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-modern-java-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ch9.md 7.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 19:52 2387d6d

Использование Intellij IDEA для решения проблем с потоками данных в Java 8

Java 8 была выпущена в марте 2014 года, и с тех пор прошло почти год. Мы планируем обновить все наши производственные серверы до этой новой версии. С этого момента мы перенесём большую часть нашего кодового хранилища на лямбда-выражения, потоки данных и новый API дат. Мы также будем использовать Nashorn для преобразования динамических сценариев в нашем приложении.

Помимо лямбд, наиболее полезной функцией является новый API потоков данных. Операции над коллекциями можно найти повсюду в любом коде, который я видел. И для этих операций потоки данных являются отличным способом улучшить читаемость кода.

Однако есть одна вещь, которая меня беспокоит: потоки данных предоставляют только несколько конечных операций, таких как reduce и findFirst, которые являются прямыми операциями, а остальные доступны только через collect. Класс инструментов Collectors предоставляет несколько удобных сборщиков, таких как toList, toSet, joining и groupingBy.

Например, следующий код фильтрует коллекцию строк и создаёт новый список:

stringCollection
    .stream()
    .filter(e -> e.startsWith("a"))
    .collect(Collectors.toList());

После переноса 300 тысяч строк кода в потоки данных я могу сказать, что toList, toSet и groupingBy являются наиболее часто используемыми конечными операциями в вашем проекте. Поэтому я не понимаю, почему эти методы не были интегрированы непосредственно в интерфейс Stream, чтобы вы могли напрямую написать:

stringCollection
    .stream()
    .filter(e -> e.startsWith("a"))
    .toList();

Это может показаться незначительным недостатком, но если вам приходится писать этот код снова и снова, это может быть очень раздражающим.

Существует метод toArray(), но нет toList(), поэтому я действительно надеюсь, что некоторые удобные сборщики будут добавлены к интерфейсу Stream в Java 9. Верно, Брайан?

В любом случае, IntelliJ IDEA утверждает, что это самый умный Java IDE. Давайте посмотрим, как использовать IDEA, чтобы решить эту проблему.

Использование IntelliJ IDEA для помощи

IntelliJ IDEA поставляется с удобной функцией под названием Live Template. Если вы ещё не знаете, что такое Live Template, это просто быстрый способ ввода часто используемых фрагментов кода. Например, если вы введёте sout и нажмёте TAB, IDEA вставит фрагмент кода System.out.println(). Для получения дополнительной информации см. здесь.

Как использовать Live Template для решения вышеуказанной проблемы? На самом деле нам нужно создать собственные Live Templates для всех широко используемых сборщиков по умолчанию для потоков данных. Например, мы можем создать Live Template для .toList, который автоматически вставляет соответствующий сборщик .collect(Collectors.toList()).

Вот как это работает на практике:

Создание собственного Live Template

Давайте посмотрим, как его создать. Сначала перейдите в настройки (Settings) и выберите Live Template в меню слева. Вы также можете использовать удобный фильтр в левом верхнем углу диалогового окна.

Затем мы можем добавить новую группу, называемую Stream, с помощью значка + справа. Затем мы добавляем все Live Templates, связанные с потоками данных, в группу. Я часто использую сборщики по умолчанию toList, toSet, groupingBy и join, поэтому я создал новый Live Template для каждого из этих методов.

Этот шаг очень важен. После добавления нового Live Template вам необходимо указать соответствующий контекст в нижней части диалогового окна. Вам нужно выбрать Java → Other, а затем определить аббревиатуру, описание и фактический код шаблона.

// Abbreviation: .toList
.collect(Collectors.toList())

// Abbreviation: .toSet
.collect(Collectors.toSet())

// Abbreviation: .join
.collect(Collectors.joining("$END$"))

// Abbreviation: .groupBy
.collect(Collectors.groupingBy(e -> $END$))

Специальная переменная $END$ указывает позицию курсора после использования шаблона, так что вы можете сразу же ввести текст в этом месте, например, определить разделитель соединения.

Совет: Вы должны включить опцию «Add unambiguous imports on the fly» (автоматически добавлять явные операторы импорта), чтобы IDEA автоматически добавляла оператор импорта java.util.stream.Collectors. Опция находится в разделе Editor → General → Auto Import.

Давайте рассмотрим эти два шаблона в действии:

Соединение

Группировка

Live Templates в IntelliJ IDEA очень гибкие и мощные. Вы можете значительно повысить свою продуктивность с их помощью. Знаете ли вы о других примерах того, как Live Templates могут спасти жизнь? Дайте мне знать!

Всё ещё недовольны? Изучите всё, что хотите узнать о потоках данных, в моём руководстве по потокам данных.

Счастливого программирования!

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-modern-java-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-modern-java-zh.git
oschina-mirror
wizardforcel-modern-java-zh
wizardforcel-modern-java-zh
master