Если вы программировали в 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 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? ( пример )
Спасибо за чтение этой статьи до сих пор. Если вам понравилась эта статья, пожалуйста, поделитесь с друзьями и коллегами. Если у вас есть какие-либо вопросы или пожелания, оставьте комментарий.
Ссылка: | Как преобразовать лямбда-выражение в ссылку на метод в Java 8? от нашего партнера JCG Джавина Пола в блоге Javarevisited . |