При работе с Java 8 и её функциональными возможностями столкнуться с выбором между использованием Function.identity()
и лямбда-выражением t->t
. Так, например, при преобразовании потока элементов в map, можно выбрать один из двух вариантов:
List<String> list = Arrays.asList("a", "b", "c"); Map<String, String> map1 = list.stream() .collect(Collectors.toMap(Function.identity(), Function.identity())); Map<String, String> map2 = list.stream() .collect(Collectors.toMap(t -> t, t -> t));
В обоих случаях результат будет одинаковым. Так, для чего же нужен Function.identity()
, если его можно заменить на, казалось бы, более простое и понятное лямбда-выражение?
Во-первых, Function.identity()
возвращает функцию, которая всегда возвращает свой входной аргумент. Это полезно в тех случаях, когда требуется явный функциональный идентификатор. Лямбда-выражение t -> t
делает то же самое, но не обладает такой явной идентификацией.
Во-вторых, Function.identity()
является предопределенной функцией и, следовательно, не требует дополнительной анонимной функции при каждом вызове, в отличие от лямбда-выражения t -> t
. Это может быть полезно с точки зрения производительности, особенно при работе с большими объемами данных.
В-третьих, использование Function.identity()
делает код более читаемым и понятным для других разработчиков, так как явно указывает на намерение возвращать тот же объект, что и принятый на вход.
Таким образом, выбор между Function.identity()
и t -> t
во многом зависит от конкретной ситуации и личных предпочтений разработчика. В целом, можно сказать, что Function.identity()
является более предпочтительным вариантом, так как обладает рядом преимуществ, связанных с производительностью и читаемостью кода.
Добавить комментарий