gpt4 book ai didi

java - 为重用声明一个静态 Java lambda 是否更有效?

转载 作者:行者123 更新时间:2023-12-04 15:09:08 24 4
gpt4 key购买 nike

<分区>

我知道有人对 lambda 和匿名实现接口(interface)之间的区别有疑问,但我想专门针对空操作检查这个问题,也就是说,针对我不想做任何事情的接口(interface)。

假设我创建了 AutoCloseable 的静态无操作实现:

private static final AutoCloseable NO_OP_AUTO_CLOSEABLE = () -> {};

我原以为这只会创建 AutoCloseable 的匿名实现,就好像我会手动这样做一样,但是(偶然通过代码中的一个单独错误)我现在看到它已经创建了一个特殊的 lambda 实现。

通过声明共享 lambda 以供重用,我是否有任何收获,或者使用 lambda 内联是否同样有效?如果我要声明一个静态 lambda,我应该继续使用接口(interface)的匿名实现吗?

这是我正在实现的方法:

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 ()->{} 时到底发生了什么?是每次都创建新的东西,还是创建一个引用然后缓存?

简而言之,从实际的 lambda 实现的角度来看,return ()->{} 比发回现有静态实例的引用效率低多少?

但正如其他人在结束这个问题时指出的那样,answerIs method reference caching a good idea in Java 8?对此进行了解释:似乎无状态 lambda 会产生某种可重用 lambda 的句柄——尝试通过创建静态可重用实例手动“缓存”它并没有真正的好处。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com