lambda 使用:非捕获 lambda 性能与静态方法接近(如各种 stream 处理 );捕获 lambda 中如果用到了方法,反编译会发现实际上是原方法 copy 过去;如果使用到了方法栈变量,每次调用 lambda 会生成一个对象;如果只引用成员变量,lambda 对象跟随父对象生命周期。
使用建议:非捕获 lambda 可以随处使用,捕获 lambda 建议在类成员变量中初始化(而不是在方法中初始化)以减少新建对象。如果必须使用方法变量/其他方法中传参了方法变量,则不可避免地会新建对象,可以保留在方法中。
https://cloud.tencent.com/developer/article/1572212
https://m.php.cn/wenda/94287.html
https://m.yht7.com/news/159464
- Lambda表达式如果不引用外部变量,性能接近静态方法,如stream编程;而匿名内部类需要作为静态成员变量来new出来才能达到同等效果
- 如果引用外部变量,不论是方法栈中的变量还是对象中的变量,或者引用当前类中的方法,每次调用时会生成新的对象:
- 如果想在外部引用时减少lambda生成的对象数,可以将其生命周期与java对象保持一致,作为成员变量进行初始化用于复用
非捕获lambda被简单地分解为一个静态方法,该方法具有与lambda表达式完全相同的签名,并在使用lambda表达式的同一类中声明。捕获lambda表达式的情况稍微复杂一些,因为捕获的变量必须与lambda的形式参数一起传递给实现lambda表达式主体的方法。如果lambda表达式读取使用它的类的某些字段,则生成的方法可以是实例方法,而不是声明为静态的,从而避免将这些字段作为附加参数传递。
对象只分配一次,大量重用lambda表达式,因此缓存非常有益。与任何性能调整练习一样,通常推荐使用科学方法。