Loop.times(5, () -> {
System.out.println("looping");
});
Run Code Online (Sandbox Code Playgroud)
哪些有效编译到?
for(int i = 0; i < 5; i++)
System.out.println("looping");
Run Code Online (Sandbox Code Playgroud)
或类似的东西
new CallableInterfaceImpl(){
public void call(){
for(int i = 0; i < 5; i++)
System.out.println("looping");
}
}.call();
Run Code Online (Sandbox Code Playgroud)
它会替换(内联类),还是实际创建一个匿名类?
术语内部类通常用于表示"需要封闭实例的嵌套类".但是,JLS声明如下:
8.1.3.内部类和封闭实例
[...]
内部类包括本地(§14.3),匿名(§15.9.5)和非静态成员类(§8.5).
[...]
声明在静态上下文中发生的内部类的实例没有词法封闭的实例.
也,
15.9.5.匿名类声明
[...]
匿名类始终是内部类(第8.1.3节); 它永远不会
static(§8.1.1,§8.5.1).
众所周知,匿名类可以在静态上下文中声明:
class A {
int t() { return 1; }
static A a = new A() { int t() { return 2; } };
}
Run Code Online (Sandbox Code Playgroud)
要尖锐地描述它,
new A() {} 是一个没有封闭实例的嵌套类,在静态上下文中定义,但它不是静态嵌套类 - 它是一个内部类.我们是否都在日常使用中为这些条款赋予了不恰当的含义?
作为一个相关的兴趣点,这个历史规范文档将术语顶层定义为内部的反面:
作为
static类成员的类和作为包成员的类都称为顶级类.它们与内部类的不同之处在于顶级类只能直接使用它自己的实例变量.
而在常见用法中,顶层被认为是嵌套的反面.
Lambda转换是一个两步过程,一个是:将lambda放入同一个类中的静态方法中.
public class Main {
public static void main(String[] args) {
Runnable r = () -> System.out.println("Hello");
System.out.println(Arrays.asList(Main.class.getDeclaredMethods()));
}
}
Run Code Online (Sandbox Code Playgroud)
[ private static void Main.lambda $ main $ 0(),public static void Main.main(java.lang.String [])]
二:生成实现功能接口的类.
System.out.println("A class has been generated: " + r.getClass());
System.out.println("That implements a Functional Interface: " + Arrays.asList(r.getClass().getInterfaces()));
Run Code Online (Sandbox Code Playgroud)
已生成一个类:类Main $$ Lambda $ 1/149928006
这实现了一个功能接口:[interface java.lang.Runnable]
问题:这种静态方法需要什么?为什么不能将lambda主体直接放入接口方法?就像是:
class Main$$Lambda$1 {
public void run() {
/* Lambda body here */
}
}
Run Code Online (Sandbox Code Playgroud)