声明用于重用的静态java lambda是否更有效?

hc2pp10m  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(331)

这个问题在这里已经有答案了

方法引用缓存在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的某种处理尝试通过创建静态可重用示例来手动“缓存”它没有真正的好处。

dfuffjeb

dfuffjeb1#

不,这没有好处。lambdas的设计是为了让java能够在不需要任何额外工作的情况下为您完成这项工作。
编写代码时尽可能使其可读。

相关问题