我最近在学习Java中的函数接口,所以是***函数***接口。当我在其中遇到identity static method的定义时,第一件让我困惑的事情是:
identity static method
static <T> Function<T, T> identity() { return t -> t; }
返回类型中的Function<T,T>是什么意思?函数定义中的小写t从何而来?详细的解释总是有帮助的。
fivyi3re1#
static <T> Function<T, T> identity() {
第一个<T>声明了一个类型变量。它类似于声明一个普通变量,例如:
<T>
void foo() { int x; // this declares a variable }
除了:
T
int x;
x
5 + 2
5 + x
String z;
T z;
z
与实际变量不同,类型变量是编译器想象出来的。编译器使用它们来使代码有意义,并更好地进行类型检查。运行时(java.exe)对它们不做任何处理。因此,它们用于连接事物:你用它们来表示:"此方法接受一个参数并返回一个值。参数的类型可以是您想要的任何类型;这个方法返回的类型与你传入的类型相同。举个例子这里,检查Function的javadoc,它的第一个类型参数是函数的 * input * 的类型,第二个是 * output * 的类型。我们在这里需要<T>的唯一原因是将em连接起来:我们想表达一个函数的概念,它的输入类型与输出类型相同。如果我们考虑identity()方法的作用,这是显而易见的:它返回一个只返回其输入的函数。因此,其输出的类型自然与其输入的类型相同。
java.exe
Function
identity()
return t -> t;
这定义了一个函数-它是lambda语法。它是以下的简写:
class MyAnonymousType<T> implements Function<T, T> { public T apply(T t) { return t; } } return new myAnonymousType<T>();
第一个t是apply(T t)中的T t的缩写-没有必要写apply,因为编译器知道你试图返回一个java.lang.function.Function,这是一个函数接口(只有一个方法的接口)-它知道你想要实现这个方法,所以不需要指定它的名称,编译器可以弄清楚。出于同样的原因,您不需要T-编译器会从函数接口中的一个方法的签名中找出它。->的缩写是:......现在是Function接口中的这个方法的实现。实现简单地是t-return t;的缩写(return是隐含的 * 除非 * 您添加大括号)。你也可以这样写:
t
apply(T t)
T t
apply
java.lang.function.Function
->
return t;
return
return t -> { return t; };
甚至:
return (T t) -> { return t; };
如果这能帮你理清头绪的话最终的结果是一个函数(名为identity),它返回一个函数(我们在这里得到了一点元!)-返回的函数将适应你所想到的任何特定类型,只要你正在寻找一个返回与它所接受的类型相同的函数,并且你想要这样一个函数的实现,它只是逐字返回输入(这自然意味着返回的东西与提供的东西具有相同的类型)。
identity
pqwbnv8z2#
javadoc:这是一个函数接口,因此可以用作lambda表达式或方法引用的赋值目标。该函数包含4个方法:
identity():此方法返回一个函数,该函数返回其唯一的参数。语法:static <T> Function<T, T> identity()其中T表示参数的类型和要返回的值返回:此方法返回一个函数,该函数返回自己的参数
static <T> Function<T, T> identity()
vuktfyat3#
让我们看一下Function接口定义public interface Function<T, R> {}**<T,R>**意味着这个接口可以接受任何类型的类T,并返回不同的类型R(不强制输出类型与输入相同)返回类型中的Function<T,T>是什么意思?我们返回一个接受并返回相同类型对象的函数。强制相同Type函数定义中的小写t从何而来?这是lambda表达式,因为Function是函数接口,只有一个抽象方法apply(T t),它接受一个输入t,我们返回相同的输入。这是一个lambda表达式,它等价于
public interface Function<T, R> {}
static <T> Function<T, T> identity() { return new Function<>() { @Override public Object apply(Object t) { return t; } }; }
1yjd4xko4#
当有疑问时,总是先查阅文档-Function。<T> Function<T, T>表示函数,其返回类型与输入类型相同。t -> t是一个lambda表达式,定义了函数,它意味着你返回输入。这在docs中也有解释:返回一个始终返回其输入参数的函数。此外,您还应该通过Oracle的lambda表达式教程-Lambda Expressions
<T> Function<T, T>
t -> t
4条答案
按热度按时间fivyi3re1#
第一个
<T>
声明了一个类型变量。它类似于声明一个普通变量,例如:除了:
T
。int x;
的意思是:“x
代表int值;在这里你可以写例如5 + 2
你也可以写5 + x
,你可以用任何值x代替'2'-一个类型变量代替一个类型。在通常写String z;
的地方,你可以写T z;
-意思是:z
是变量。这个变量的类型是T
typevar表示的任何类型。与实际变量不同,类型变量是编译器想象出来的。编译器使用它们来使代码有意义,并更好地进行类型检查。运行时(
java.exe
)对它们不做任何处理。因此,它们用于连接事物:你用它们来表示:"此方法接受一个参数并返回一个值。参数的类型可以是您想要的任何类型;这个方法返回的类型与你传入的类型相同。举个例子
这里,检查
Function
的javadoc,它的第一个类型参数是函数的 * input * 的类型,第二个是 * output * 的类型。我们在这里需要
<T>
的唯一原因是将em连接起来:我们想表达一个函数的概念,它的输入类型与输出类型相同。如果我们考虑identity()
方法的作用,这是显而易见的:它返回一个只返回其输入的函数。因此,其输出的类型自然与其输入的类型相同。这定义了一个函数-它是lambda语法。它是以下的简写:
第一个
t
是apply(T t)
中的T t
的缩写-没有必要写apply
,因为编译器知道你试图返回一个java.lang.function.Function
,这是一个函数接口(只有一个方法的接口)-它知道你想要实现这个方法,所以不需要指定它的名称,编译器可以弄清楚。出于同样的原因,您不需要T
-编译器会从函数接口中的一个方法的签名中找出它。->
的缩写是:......现在是Function接口中的这个方法的实现。实现简单地是t
-return t;
的缩写(return
是隐含的 * 除非 * 您添加大括号)。你也可以这样写:甚至:
如果这能帮你理清头绪的话
最终的结果是一个函数(名为
identity
),它返回一个函数(我们在这里得到了一点元!)-返回的函数将适应你所想到的任何特定类型,只要你正在寻找一个返回与它所接受的类型相同的函数,并且你想要这样一个函数的实现,它只是逐字返回输入(这自然意味着返回的东西与提供的东西具有相同的类型)。pqwbnv8z2#
javadoc:
这是一个函数接口,因此可以用作lambda表达式或方法引用的赋值目标。
该函数包含4个方法:
identity()
:此方法返回一个函数,该函数返回其唯一的参数。
语法:
static <T> Function<T, T> identity()
其中T表示参数的类型和要返回的值
返回:此方法返回一个函数,该函数返回自己的参数
vuktfyat3#
让我们看一下Function接口定义
public interface Function<T, R> {}
**<T,R>**意味着这个接口可以接受任何类型的类T,并返回不同的类型R(不强制输出类型与输入相同)返回类型中的Function<T,T>是什么意思?
我们返回一个接受并返回相同类型对象的函数。强制相同Type
函数定义中的小写t从何而来?
这是lambda表达式,因为Function是函数接口,只有一个抽象方法apply(T t),它接受一个输入t,我们返回相同的输入。这是一个lambda表达式,它等价于
1yjd4xko4#
当有疑问时,总是先查阅文档-Function。
<T> Function<T, T>
表示函数,其返回类型与输入类型相同。t -> t
是一个lambda表达式,定义了函数,它意味着你返回输入。这在docs中也有解释:返回一个始终返回其输入参数的函数。
此外,您还应该通过Oracle的lambda表达式教程-Lambda Expressions