JavaRush /Java блог /Random /Кофе-брейк #89. 10 лучших плагинов IntelliJ IDEA, которые...

Кофе-брейк #89. 10 лучших плагинов IntelliJ IDEA, которые повысят вашу производительность. Обработка исключений в Java Streams с использованием функционального интерфейса

Статья из группы Random

10 лучших плагинов IntelliJ IDEA, которые повысят вашу производительность

Источник: Hackernoon Недавно я поинтересовался у разработчиков, использующих IntelliJ IDEA, какие плагины для этой IDE им больше всего нравятся? На основе собранных ответов получился список из 10 наиболее популярных расширений. Кофе-брейк #89. 10 лучших плагинов IntelliJ IDEA, которые повысят вашу производительность. Обработка исключений в Java Streams с использованием функционального интерфейса - 1

1. WakaTime

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

2. Stepsize

Этот плагин помогает при решении проблем, связанных с техническим долгом, обслуживанием и рефакторингом кода. Stepsize позволяет:
  • делать закладки в коде;
  • отслеживать технический долг прямо от редактора;
  • создать TODO;
  • расставлять приоритеты по техническим вопросам при планировании спринта;
  • сотрудничать с коллегами по команде во время обслуживания и рефакторинга кода.

3. Key Promoter X

Key Promoter X поможет вам выучить значение ярлыков и кнопок в IntelliJ IDEA. Когда вы наводите мышь на кнопку внутри IDE, Key Promoter X показывает вам сочетание клавиш, которое вы можете использовать вместо нажатия мыши.

4. ZIO для IntelliJ

ZIO предоставит вам предложения, рефакторинги и другие улучшения для экосистемы Scala ZIO. Плагин расширяет библиотеку ZIO такими функциями, как:
  • рефакторинг и предложения;
  • поддержка zio-макросов (например, @accessible);
  • встроенный тестовый прогон.

5. Protobuf

Плагин Protobuf Language для IDE на основе IntelliJ обеспечивает поддержку языка Protobuf. Protobuf помогает с выделением синтаксиса, импортом файлов из библиотеки и SDK, навигацией, сворачиванием кода, семантическим анализом и быстрой документацией.

6. SonarLint

SonarLint позволяет исправлять проблемы с кодом до того, как они возникнут. Как средство проверки орфографии, SonarLint выделяет ошибки и уязвимости безопасности при написании кода с четкими инструкциями по исправлению, чтобы вы могли исправить их еще до того, как код будет зафиксирован. SonarLint в VS Code поддерживает анализ кода в Java, JavaScript, TypeScript, Python, HTML и PHP.

7. ESLint

ESLint поддерживает отображение предупреждений eslint в виде инспекций IntelliJ, помогает выполнять быстрые исправления для нескольких правил, поддерживает настраиваемые правила eslint, а также аннотацию и завершение конфигурации eslint.

8. Prettier

Расширение Prettier помогает коду выглядеть лучше и быть более последовательным. Он обеспечивает согласованный стиль, анализируя ваш код и переписывая его в соответствие со своими правилами и учетом максимальной длины строки.

9. Quokka

Quokka.js — это инструмент повышения производительности разработчика для быстрого прототипирования JavaScript / TypeScript. В IDE он обновляет показатель времени выполнения рядом с кодом по мере ввода. Это значительно ускоряет создание прототипов, обучение и тестирование JavaScript / TypeScript.

10. AceJump

AceJump позволяет быстро перемещать курсор в любую позицию, видимую в редакторе. Просто нажмите “CRTL+;”, введите символ, затем введите соответствующий символ для Ace Jump. Если на экране не найдено совпадений, AceJump перейдет к следующему совпадению, которое сможет найти.

Обработка исключений в Java Streams с использованием функционального интерфейса

Источник: Dev.to Кофе-брейк #89. 10 лучших плагинов IntelliJ IDEA, которые повысят вашу производительность. Обработка исключений в Java Streams с использованием функционального интерфейса - 2Недавно я просматривал код и наткнулся на что-то вроде этого:

subject.getIdentities().forEach(i -> {
  try {
    caseService.updateDocument(i.getCase());
  } catch (Exception e) {
    log.error(e); 
  }
});
Поскольку я большой поклонник лямбда-выражений и люблю краткость, приведенный выше код мне кажется не очень лаконичным и немного запутанным. Чтобы его очистить, следует использовать функциональные интерфейсы. Что для этого нам нужно? Мы знаем, что forEach ожидает на входе Consumer. Если бы мы могли обернуть нашу логику, обрабатывающую исключение, в Consumer, то затем мы могли бы использовать логику в forEach. Основная логика внутри forEach — это следующая строка:

//try catch removed
// i is an Identity and updateDocument returns a UpdateResponse
i -> caseService.updateDocument(i.getCase());
Мы знаем тип ввода и возврата, и мы можем создать функциональный интерфейс, метод которого генерирует исключение.

@FunctionalInterface
public interface ThrowingFunction<Identity, UpdateResponse> {
  UpdateResponse apply(Identity i) throws Exception;
}
Мы можем сделать код еще более удобным с помощью дженериков.

@FunctionalInterface
public interface ThrowingFunction<T, R> {
  R apply(T t) throws Exception;
}
После создания интерфейса исходная логика может стать типизированной:

ThrowingFunction<Identity, UpdateResponse> tf = i -> caseService.updateDocument(i.getCase());
Теперь, когда у нас есть функциональный интерфейс для нашей логики, мы можем передать его в качестве параметра методу, который обрабатывает исключение и возвращает Consumer, который мы можем использовать в forEach.

private static <T, R> Consumer<T> wrap(ThrowingFunction<T, R> f) {
  return t -> {
    try  {
      f.apply(t);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  };
}
Это выглядит немного странно, но, по сути, метод wrap принимает ThrowingFunction в качестве входных данных и обрабатывает выполнение функции или перехватывает и выбрасывает исключения в Consumer. Теперь мы можем обернуть любую используемую логику в forEach, которая может вызвать исключение. Это выглядит примерно так:

// target type the original logic
ThrowingFunction<Identity, UpdateResponse> tf = i -> caseService.updateDocument(i.getCase()):

// pass logic to the wrapmethod
// which will execute the function or throw a RunTimeException. 
Consumer<Identity> p = wrap(tf);

// use Consumer in foreach
subject.getIdentities().forEach(p);
Или, если вы предпочитаете одну строку:

subject.getIdentities().forEach(wrap(i -> caseService.updateDocument(i.getCase())));
Согласитесь, что так намного лучше! Вы можете реализовать что-то подобное для обработки различных типов функциональных интерфейсов. Например, операция Map принимает в качестве входных данных только Function. Вместо метода обертывания, возвращающего Consumer, у вас может быть метод, возвращающий функцию. Это всего лишь один из способов обработки исключений в потоках. Я должен упомянуть, что есть библиотеки, которые делают это за вас. Также вы можете использовать монаду для обработки успехов или неудач, но это выходит за рамки этого поста.
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Sergey Drogunov Уровень 111 Expert
9 декабря 2021
Надеюсь я это когда-нибудь пойму более детально. (я про вторую часть поста)