Статьи

Как преобразовать лямбда-выражение в ссылку на метод в Java 8?

Если вы программировали в Java 8, то вы знаете, что использование ссылки на метод вместо лямбда-выражения делает ваш код более читабельным, поэтому рекомендуется заменять лямбда-выражение ссылкой на метод везде, где это возможно. Но большой вопрос в том, как вы найти можно ли заменить лямбду на ссылку на метод? Да, это не так просто, особенно если вы используете Java 8 всего пару месяцев и изо всех сил пытаетесь разобраться в концепциях и идиомах функционального программирования. В любом случае, простое правило замены лямбда-выражения ссылкой на метод основано на здравом смысле, который вы узнаете в этой статье.

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

Как заменить лямбда-выражение ссылкой на метод в Java 8

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

1
2
3
4
listOfNumbers.stream().sorted().forEach(number -> {
  System.out.println(number);
  }
);

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

1
2
3
number -> {
  System.out.println(number);
}

со ссылкой на метод, как показано ниже:

1
listOfNumbers.stream().sorted.forEach(System.out::println);

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

1
2
3
4
listOfNumbers.stream().sorted().forEach(number -> {
  System.out.println(String.valueOf(number));
  }
);

Оператор с двойной двоеточием (: 🙂 используется для ссылки на метод, и на самом деле его можно использовать в трех основных случаях:

1
2
3
object::instanceMethod
Class::staticMethod
Class:instanceMethod

В первых двух случаях ссылка на метод эквивалентна лямбда-выражению, которое предоставляет параметры метода, например
System.out :: println эквивалентен
x -> System.out.println (x) и
Math :: pow эквивалентно
(x, y) -> Math.pow (x, y).

В этом случае первый параметр становится целью метода. Например,
String :: compareToIgnoreCase такой же, как

1
(x, y) -> x.compareToIgnoreCase(y)

или этот :: равно

1
(x -> this.equals(x))

Вы можете прочитать больше о преобразовании лямбда-выражения этого типа в ссылку на метод в Java SE 8 для Really Impatient , у него есть немного больше объяснений и примеров по этой теме.

Другим хорошим примером замены лямбда-выражения на ссылку на метод является следующий код сортировки карты по значениям в Java 8 :

1
2
3
4
Map sortByValue = map.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer>comparingByValue())
.collect(Collectors.toMap(e -> e.getKey(),e -> e.getValue()));

можно переписать следующим образом, используя ссылку на метод:

1
2
3
4
5
Map sortByValue = map.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer>comparingByValue())
.collect(toMap(Map.Entry::getKey,
               Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

если вы посмотрите внимательно, мы заменили e -> e.getKey () на
Map.Entry :: getKey и e -> g.getValue () для
Map.Entry :: getValue, потому что у нас уже есть код, который делали эти лямбда-выражения в форме методов getKey () и getValue ().

Это все о том, когда и как заменить лямбда-выражение ссылкой на метод в Java 8 . Вы можете заменить, только если вы не делаете никаких изменений, в противном случае вы не можете заменить. Почему вы хотите это сделать? Ну, потому что ссылка на метод более краткая и читаемая, чем лямбда-выражение.

Что нового в Java 8

Java SE 8 для действительно нетерпеливых

От коллекций к потокам в Java 8 с помощью лямбда-выражений

Потоки, коллекторы и дополнительные функции для обработки данных в Java 8

Связанные руководства по Java 8

Если вы хотите узнать больше о новых возможностях Java 8, вот мои предыдущие статьи, в которых рассматриваются некоторые важные концепции Java 8:

  • 20 примеров даты и времени в Java 8 ( учебное пособие )
  • 5 книг для изучения Java 8 с нуля ( книги )
  • Как присоединиться к String в Java 8 ( пример )
  • Как использовать метод filter () в Java 8 ( учебник )
  • Как отформатировать / проанализировать дату с LocalDateTime в Java 8? ( учебник )
  • Как использовать класс Stream в Java 8 ( учебник )
  • Как использовать метод forEach () в Java 8 ( пример )
  • Как преобразовать Список в Карту в Java 8 ( решение )
  • Как использовать метод peek () в Java 8 ( пример )
  • Как отсортировать карту по ключам в Java 8? ( пример )
  • 10 примеров необязательных в Java 8? ( пример )

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