JavaRush /Java блог /Random UA /Кава-брейк #89. 10 найкращих плагінів IntelliJ IDEA, які ...

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

Стаття з групи Random UA

10 найкращих плагінів IntelliJ IDEA, які підвищать вашу продуктивність

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

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 з використанням функціонального інтерфейсу. Нещодавно я переглядав код і натрапив на щось на кшталт цього:
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, у вас може бути метод, який повертає функцію. Це лише один із способів обробки винятків у потоках. Я маю згадати, що є бібліотеки , які роблять це за вас. Також ви можете використовувати монаду для обробки успіхів або невдач, але це виходить за межі цього посту.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ