Перейти к содержимому

Function identity java что это

  • автор:

Интерфейс Function

Function — это встроенный функциональный интерфейс, добавленный в Java SE 8 в пакет java.util.function .

Принимает значение в качестве аргумента одного типа и возвращает другое значение. Часто используется для преобразования одного значения в другое:

@FunctionalInterface public interface Function

Функциональный дескриптор интерфейса:

T -> R

Рассмотрим пример использования интерфейса Function :

import java.util.function.Function; public class FunctionDemo1 < public static void main(String[] args) < Functionfunction = d -> Math.round(d); System.out.println(function.apply(5.7)); > >

Методы по умолчанию интерфейса Function :

default Function andThen(Function after); default Function compose(Function before);

Следующий пример показывает разницу между этими методами:

import java.util.function.Function; public class FunctionDemo2 < public static void main(String[] args) < Functionf1 = s -> s + "1"; Function f2 = s -> s + "2"; Function f3 = s -> s + "3"; Function f4 = s -> s + "4"; System.out.println(f1.andThen(f2).compose(f3).compose(f4).apply("Compose")); System.out.println(f1.andThen(f2).andThen(f3).apply("AndThen")); > >

Статический метод интерфейса Function :

static Function identity()

Возвращает интерфейс Function , который всегда возвращает входной параметр. Рассмотрим пример использования:

import java.util.function.Function; public class FunctionDemo3 < public static void main(String[] args) < Functionf = Function.identity(); System.out.println(f.apply("Some Value")); > >
  • Лямбда выражения
  • Функциональный интерфейс
  • Интерфейс Predicate
  • Интерфейс Consumer
  • Интерфейс Supplier
  • Интерфейс UnaryOperator
  • Специализации функциональных интерфейсов
  • Ссылки на методы
  • Задачи

Function. Identity Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Use ‘Java.Util.Functions.IFunction.Identity’. This class will be removed in a future release.

Возвращает функцию, которая всегда возвращает входной аргумент.

[Android.Runtime.Register("identity", "()Ljava/util/function/Function;", "", ApiSince=24)] [Java.Interop.JavaTypeParameters(new System.String[] < "T" >)] [System.Obsolete("Use 'Java.Util.Functions.IFunction.Identity'. This class will be removed in a future release.")] public static Java.Util.Functions.IFunction? Identity ();
[] [)>] [] static member Identity : unit -> Java.Util.Functions.IFunction
Возвращаемое значение

функция, которая всегда возвращает входной аргумент

Комментарии

Возвращает функцию, которая всегда возвращает входной аргумент.

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.

Лямбды в Java 8, что лучше использовать — Function.identity() или t->t?

Должен ли я использовать Function.identity() вместо str->str (или наоборот)? Я думаю, что второй вариант более читабелен и понимаем(допустим, если новый человек не знает что делает identity ). Но есть ли «реальная» причина, из-за которой следует отдать предпочтение одному из способов?

Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 9 апр 2019 в 11:14
Anton Sorokin Anton Sorokin
7,008 6 6 золотых знаков 37 37 серебряных знаков 65 65 бронзовых знаков
ассоциация: stackoverflow.com/questions/28032827/…
9 апр 2019 в 11:14

И про collect кто-то может не знать, и про map , если этот кто-то знаком с функциональным программированием меньше недели. Если писать код, который смогут прочитать даже такие специалисты, увы, только они этот код и станут читать.

9 апр 2019 в 11:20

@extrn невозможно помнить все API и методы библиотеки(любой). identity() — не такой важный метод, чтобы всегда помнить что он делает.

9 апр 2019 в 11:30

Термин Identity function известен далеко за пределами java API , и реализации такой функции присутствуют во многих функциональных языках: Common Lisp, Haskell, F#, Scala и т.д.

9 апр 2019 в 11:50

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Первоначально кажется, что у этих двух способов нет отличия, ведь реализация identity() такова:

static Function identity() < return t ->t; > 

Однако Function.identity() всегда будет возвращать один и тот же экземпляр(обоснование этого решения), в то время как t -> t не только будет создавать новый экземпляр, но даже будет иметь отдельный класс реализации. Для более подробной информации смотрите здесь.

Причина в том, что компилятор генерирует синтетический метод, содержащий тело лямбда выражений(случае t -> t это будет return t; ) и указывает среде выполнения создать реализацию функционального интерфейса, вызывающего этот метод.

Поэтому использование Function.identity() вместо t -> t может сэкономить немного памяти, но совсем небольшое количество, поэтому это не должно влиять на ваше решение, если вы считаете, что t -> t более читабельно, чем Function.identity() .

Также в некоторых методах нельзя вызвать Function.identity() . Допустим, есть такой список:

List list . . 

Код ниже отлично скомпилируется:

int[] arrayOK = list.stream().mapToInt(i -> i).toArray(); 

Но если попытаться скомпилировать следующий код, то будет ошибка компиляции:

int[] arrayProblem = list.stream().mapToInt(Function.identity()).toArray(); 

Она произойдет из-за того что mapToInt ожидает ToIntFunction , которая не связана с Function . Также у ToIntFunction нет метода identity() .

Разница между Function.identity() и t->t в Java 8

При работе с 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() является более предпочтительным вариантом, так как обладает рядом преимуществ, связанных с производительностью и читаемостью кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *