阅读一篇文章状态我来到主题目标打字时我自己有点混淆当我阅读以下段落时:
ActionListener l = (ActionEvent e) -> ui.dazzle(e.getModifiers());这种方法的一个含义是,相同的lambda表达式在不同的上下文中可以有不同的类型:
Run Code Online (Sandbox Code Playgroud)Callable<String> c = () -> "done"; PrivilegedAction<String> a = () -> "done";在第一种情况下,lambda表达式
() -> "done"表示的实例Callable.在第二种情况下,同一表达式表示PrivilegedAction的实例.编译器负责推断每个lambda表达式的类型.它使用表达式出现的上下文中的预期类型; 此类型称为目标类型.lambda表达式只能出现在目标类型是功能接口的上下文中.
访问这里的完整文章
您能否以一种简单的方式向我解释以上段落所遵循的这些要点:
如果你还给我一个代码片段,我将非常感激
Rea*_*tic 14
Context是在代码中使用表达式的方式.它不仅仅是lambda表达式 - 它是任何表达式,比如a+b,a++或Math.random().
可能的上下文示例:
作业:接受表达a+b.如果将其分配给变量,则将其用于赋值上下文:
c = a+b;
Run Code Online (Sandbox Code Playgroud)方法或构造函数的参数:.这是当你将它传递给某个方法调用时:
System.out.println(a+b);
Run Code Online (Sandbox Code Playgroud)返回值:在return语句中使用表达式时:
return a+b;
Run Code Online (Sandbox Code Playgroud)数组的索引:当表达式是数组的索引时:
x[a+b] = 3;
Run Code Online (Sandbox Code Playgroud)该目标类型是预期在给定上下文的类型.例如,如果您将方法定义为:
public int myMethod() { ... }
Run Code Online (Sandbox Code Playgroud)
那么return它的主体语句中的任何表达式都应该具有该类型int.所以,如果你有这个:
return a+b;
Run Code Online (Sandbox Code Playgroud)
在内部myMethod,预计a+b将解析为int可分配给int 的或其他东西.
现在,假设你有这个方法:
public void anotherMethod( double d );
Run Code Online (Sandbox Code Playgroud)
然后,当您调用它并将表达式作为参数传递时,该表达式应为类型double.所以像这样的电话:
anotherMethod(a+b);
Run Code Online (Sandbox Code Playgroud)
期待a+b解决到double.这是它的目标类型.
在声明中:
Callable<String> c = () -> "done";
Run Code Online (Sandbox Code Playgroud)
表达式是lambda表达式() -> "done".它用于赋值上下文(它被赋值c).而目标类型是Callable<String>因为这是你分配任何东西时所期望的c.
有关更正式的讨论,请参阅Java语言规范,第5章.
Lambda表达式是功能接口的实例。但是,lambda表达式本身并不包含有关它正在实现哪个功能接口的信息。该信息是从使用它的上下文中推导出来的。例如,表达式
x -> 2 * x
Run Code Online (Sandbox Code Playgroud)
可以是功能接口的实例
interface IntOperation { int operate(int i); }
Run Code Online (Sandbox Code Playgroud)
所以写是合法的
IntOperation iop = x -> x * 2;
Run Code Online (Sandbox Code Playgroud)
此处赋值右侧的表达式的预期类型为IntOperation。这称为lambda表达式的目标类型。显然,lambda表达式可以与不同的功能接口类型兼容,因此可以得出结论,同一lambda表达式在不同的上下文中可以具有不同的目标类型。例如,给定一个接口
interface DoubleOperation { double operate(double i); }
Run Code Online (Sandbox Code Playgroud)
写也是合法的
DoubleOperation dop = x -> x * 2;
Run Code Online (Sandbox Code Playgroud)
Lambda表达式的目标类型必须是一个函数接口,并且与该目标类型兼容,该Lambda表达式必须具有与该接口的函数类型相同的参数类型,其返回类型必须与该函数类型兼容,并且只能抛出函数类型允许的异常。
让我添加有关Lambda的资源。这对于在Lambdas上下文中清楚地理解许多概念很有帮助。该资源是LAMBDA常见问题解答。{免责声明:我与网站没有任何关系。我刚巧访问了该站点,所以我想推荐它,以便人们可以从中受益。}希望它能有所帮助。
| 归档时间: |
|
| 查看次数: |
4270 次 |
| 最近记录: |