什么是不执行任何操作的 Lambda?

78

我需要一个函数式接口 Runnable 的 lambda 表达式,它什么也不做。我以前有一个方法。

private void doNothing(){
    //Do nothing
}

然后使用this::doNothing。但我已经找到了一个更简短的方法。


2
https://dev59.com/B10a5IYBdhLWcg3w3MA- - Holger
3个回答

97

对于Runnable接口,您应该编写类似以下内容的代码:

Runnable runnable = () -> {};

其中:

  • () 表示run方法没有参数
  • {} 是run方法的主体,在这个例子中是空的

之后,你可以调用该方法。

runnable.run();

对于那些希望在@FunctionalInterface的精神中使用强类型的人来说,这里有一个等效的解决方案:https://dev59.com/B10a5IYBdhLWcg3w3MA-#76985309 - chaotic3quilibrium

52
我现在使用的lambda表达式是:

lambda表达式:

() -> {}

我们的代码库中有数百个这样的实例。这使得重构法律代码库变得令人沮丧。我用这个链接具体说明了这个模式:https://dev59.com/B10a5IYBdhLWcg3w3MA-#76985309 - chaotic3quilibrium

16

Guava - Runnables.doNothing();


8
为一个6个字符的表达式引入一个库是疯狂的。即使你的依赖项中已经有Guava,这种解决方案也比简单表达式更长,并且不会提高可读性。 - Björn Zurmaar
13
我认为这会提高可读性。你可以进行静态导入,然后在代码中只需看到“doNothing()”。读者很快就能理解你有意决定“什么都不做”。当然,为此单独添加Guava到类路径中是浪费的。 - fascynacja
2
添加一条注释,以表明您有意决定不采取任何行动。 - MeanwhileInHell
对于内存分配来说,使用() -> {}会导致JVM每次调用时创建新对象,不像doNothing可能引用单例对象。 - Mateusz Fryc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接