这个问题在这里已经有答案了:
方法引用缓存在Java8中是个好主意吗(3个答案)
8天前关门了。
我知道有人对lambdas和匿名实现接口之间的区别提出了疑问,但是我想专门针对no-ops,也就是说,对于一个我不想做任何事情的接口来研究这个问题。
假设我创建了 AutoCloseable
:
private static final AutoCloseable NO_OP_AUTO_CLOSEABLE = () -> {};
我假设这只会创建 AutoCloseable
好像我应该手动完成,但是(偶然地通过代码中的一个单独的bug)我现在看到它创建了一个特殊的lambda实现。
通过声明一个共享lambda以供重用,我能得到什么好处吗?或者,内联使用lambda同样有效吗?如果我要声明一个静态lambda,我应该继续使用接口的匿名实现吗?
以下是我正在实施的方法:
public static AutoCloseable toAutoCloseable(Object object) {
return if(object instanceof AutoCloseable)
? (AutoCloseable)object
: NO_OP_AUTO_CLOSEABLE;
}
显然我不想用 new AutoCloseable(){…}
方法中的每一次。所以在lambda之前的日子里,我当然会创建一个共享的静态版本:
private static final AutoCloseable NO_OP_AUTO_CLOSEABLE = new AutoCloseable() {…};
但是如果它创建了一个lambda,那么使用lambda内联会同样有效吗?
public static AutoCloseable toAutoCloseable(Object object) {
return if(object instanceof AutoCloseable)
? (AutoCloseable)object
: ()->{};
}
当然,简单地返回一个引用总是比创建任何东西都要高效,但是lambda是重用的吗?我说的时候到底发生了什么 return ()->{}
? 是每次都创建新的内容,还是创建一个引用然后缓存?
简而言之,效率要低多少 return ()->{}
从实际的lambda实现的Angular 来看,是否过度发回对现有静态示例的引用?
但正如其他人在结束这个问题时所指出的,方法引用缓存在Java8中是一个好主意吗?解释如下:似乎无状态lambda将导致对重用lambda的某种处理尝试通过创建静态可重用示例来手动“缓存”它没有真正的好处。
1条答案
按热度按时间dfuffjeb1#
不,这没有好处。lambdas的设计是为了让java能够在不需要任何额外工作的情况下为您完成这项工作。
编写代码时尽可能使其可读。