如果搜索“ java双括号”,则会发现反对使用它的强烈理由。
每当有人使用双括号初始化,一只小猫就会被杀死。 https://stackoverflow.com/a/27521360/555631
参数是您正在创建太多的匿名类,并且可能会导致内存泄漏。
lambdas有什么不同吗?他们每个人都创建一个匿名内部类,他们每个人都引用其封闭的闭包。
答案 0 :(得分:2)
Lambda表达式不同于碰巧实现功能接口的匿名内部类。
匿名内部类将在编译时创建自己的类文件,如果它们包含在Foo$1.class
类中,则通常类似于Foo
。它是一个功能齐全的类,可实现接口或为类提供子类。要引用超出其范围的局部值,它将在后台在匿名内部类中创建一个实例变量,该实例变量表示该值的 copy 。这就是为什么变量必须有效地为final的原因-否则实际变量可能会更改,并且副本可能已过时。
Lambda表达式不会创建匿名内部类。它们使用产生java.lang.invoke.LambdaMetafactory
的{{1}},以后可以使用它们执行lambda表达式。 Lambda表达式(无论是块还是表达式)都将转换为包含它的类中的隐藏的私有静态方法。不是使用隐藏变量创建类,而是将捕获的值转换为隐藏的私有静态方法的参数。局部值仍然必须是有效的最终值,因为传递给该方法的值还是一个副本。该方法由JVM中的CallSite
指令调用。
来源:
答案 1 :(得分:1)
是的,它们是不同的。