Изучаем примеры лямбда-выражений (Lambda Expressions) в Java

Источник: Medium В этой статье мы рассмотрим лямбда-выражения — основу функционального программирования Java. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 1

Синтаксис лямбда-выражений

Синтаксис лямбда-выражений интуитивно понятен, прост для понимания и применения. Лямбда-выражение состоит из:
  1. входных параметров
  2. оператора arrow
  3. блока выражений/операторов (expression/statements)
Общий формат таков:

<input-params> -> <function-code>

Примеры лямбда-выражений

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

1. Не принимает входных данных и не возвращает выходных данных

Простое лямбда-выражение не принимает никаких входных данных и не возвращает никаких выходных данных — это буквально просто блок кода, который выполняется без какого-либо контекста.

() -> System.out.println("Here I am!");
Указание () в начале, в позиции входных параметров, означает, что параметры не передаются (как и с пустыми скобками, которые следуют за методом, у которого нет параметров).

2. Принимает единичный ввод, возвращает без вывода

Чтобы лямбда-выражение принимало параметр, мы помещаем его в позицию входных параметров:

name -> System.out.println("Here you are too, " + name +  "!");
ПРИМЕЧАНИЕ. Если у нас один входной параметр, мы можем опустить круглые скобки. Также мы можем указать (name), это вполне допускается.

3. Принимает несколько входных данных, не возвращает никаких выходных данных

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

(name, food) -> System.out.println("So " + name + " enjoys eating " + food + "... interesting!");

4. Содержит несколько операторов в разделе кода

Сохранение лямбда-выражений в однострочных операторах считается хорошей практикой. Но можно также применять и несколько строк:

() -> {
  System.out.println("The owl and the pussycat went to sea");
  System.out.println("in a beautiful pea green boat");
}

5. Типы возвращаемых значений никогда не указываются

Как вы, возможно, заметили, при определении лямбда-выражения возвращаемые типы не указываются. Вот пример:

() -> System.out.println("I don't return anything!")
И еще один:

() -> "I return this String!"
Оба примера кода почти одинаковы, но вторая лямбда возвращает строку. Учтите это при их использовании. Разумеется, компилятор поймет разницу между ними благодаря условному использованию дескрипторов функций.

6. Вывод типа применяется автоматически, где это возможно

Чтобы определить тип, компилятор будет использовать вывод типа. Для этого он просматривает контекст выполнения лямбда-выражения. Для разработчика это означает, что ему не придется беспокоиться о приведении к определенному типу.

7. Обозначение дескриптора функции

Когда мы думаем о том, каким типам можно присвоить лямбда-выражение, очень полезно использовать дескрипторы функций. Дескриптор функции — это, по сути, сигнатура метода, которую предоставляет лямбда-выражение (или метод). Его синтаксис почти такой же, как и у лямбда-выражений, за исключением того, что вместо раздела кода есть раздел типа вывода. Вот пример:

<input-parameter-types> -> <output-parameter-type>

Примеры дескрипторов функций

Вот несколько примеров дескрипторов функций: () -> () Метод, не принимающий входных параметров и не возвращающий значения. (String) -> () Метод, принимающий входной параметр и не возвращающий значения. () -> (int, float) Метод, не принимающий входных параметров и возвращающий int и a float(int[]) ->. (SortedMap<Character, Integer>) Метод, принимающий массив int и возвращающий SortedMap от Character до Integer. Наличие дескрипторов функций упрощает оценку совместимости типов при рассмотрении того, какие целевые типы мы можем использовать для лямбда-выражения.

Заключение

Как видите, лямбда-выражения — это аккуратный и простой способ инкапсуляции поведения. Это одна из основ парадигмы функционального программирования, представленных в Java с выпуском JDK 8.

7 самых недооцененных функций IntelliJ IDEA

Источник: Better Programming В это трудно поверить, но спустя много лет я все еще встречаю людей, которые не знают об этих отличных функциях в IntelliJ IDEA.

1. Find anything

Довольно сложно запомнить каждую комбинацию клавиш и отследить все, что умеет IntelliJ IDEA. Вот почему я часто использую поиск внутри IntelliJ IDEA. Это помогает мне находить нужные пункты меню, инструменты, настройки и даже файлы в одном месте. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 2

2. Know where you are

До того, как я нашел эту функцию, я использовал кнопку “Выбрать открытый файл”, чтобы отобразить редактируемый в данный момент файл в дереве проекта. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 3Теперь за меня это делает IntelliJ IDEA. Это не опция по умолчанию, поэтому вам нужно будет установить ее для каждого нового или существующего проекта. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 4

3. SQL optimization

Знаете ли вы, что подключаемый модуль базы данных по умолчанию в вашей среде IDE — это больше, чем простой исполнитель SQL? Учитывая тот факт, что уровень сохраняемости (ввод/вывод) всегда является самой медленной частью приложения, я всегда удостоверяюсь, что мои SQL-запросы имеют хороший план выполнения при работе с реляционными базами данных. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 5

4. Многострочное редактирование (Multiline editing)

Возможно, вы раньше использовали эту функцию в редакторе Sublime Text Editor. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 6

5. Go Back / Forward (Назад/Вперед)

Я действительно часто перемещаюсь в то место, где был раньше, нажимая кнопки “назад” или “вперед”. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 7Перейти назад/вперед: ⌥⌘+стрелка влево/вправо (Ctrl+Alt+стрелка влево/вправо для Win/Linux). Чтобы открыть последние файлы, нажмите ⌘E (Ctrl+E для Win/Linux).

6. Закладки

Я добавляю важные части кода в закладки, чтобы быстро перейти к ним в любой момент. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 8Чтобы перейти к закладке, нажмите ⌃+<номер> (Ctrl+<номер> для Win/Linux). Сразу скажу, что я не использую более трех закладок одновременно, так как потом становится сложно вспомнить, для чего они нужны.

7. Один редактор для всего

Раньше я открывал другие текстовые редакторы, такие как Visual Studio Code или Sublime, чтобы сохранять части кода, JSON, XML, и потом ссылаться на них. Но это не является частью базы кода (проекта), и IntelliJ IDEA четко напоминает об этом, когда вы пытаетесь создать или отредактировать что-то подобное. Затем я увидел, как один из моих коллег использует Snippets, и понял, насколько это гениально. Кофе-брейк #150. Изучаем примеры лямбда-выражений (Lambda Expressions) в Java. 7 самых недооцененных функций IntelliJ IDEA - 9Новый файл Snippet: ⇧⌘N (Shift+Ctrl+N для Win/Linux). Snippets доступны и синхронизируются во всех окнах ваших проектов. Я часто использую их для изучения и форматирования некоторых JSON или SQL, которые я получил откуда-то еще.

Мой секретный рецепт

Вишенкой на торте для вас станет функция, которая экономит мне массу времени при наборе текста каждый день: Tabnine — плагин JetBrains для компиляции кода Intellij IDEA на основе искусственного интеллекта. Пока что он бесплатный, но поторопитесь, я не думаю, что это продлится долго.