这听起来可能是一个奇怪的问题,但是在Java8中是否有一种方法可以引用Lambda的标准no-op(也称为空操作、空模式方法、无操作、不做任何事情的方法)方法。
现在,我有一个方法,比如void foo(Consumer<Object>)
,我想给予它一个no-op,我必须声明:
foo(new Consumer<Object>() {
public void accept(Object o) {
// do nothing
}
}
在那里我希望能够做一些类似这样的事情:
foo(Object::null)
类似的东西是否存在?
不确定多参数方法如何工作--也许这是Java中lambda的一个缺陷。
6条答案
按热度按时间aurhwmvo1#
这是没有缺陷的。
Java中的Lambda是函数接口的示例;这些示例可以简化为一个抽象方法,即SAM。
但是这个SAM仍然需要一个有效的原型。在您的例子中,您需要一个no-op
Consumer<T>
,它不做任何T
的事情。然而,它仍然需要是
Consumer<T>
;这意味着您可以使用的最小声明是:并在需要的地方使用
NOOP
。qqrboqgw2#
在您的特定情况下,您可以简单地执行以下操作:
这意味着lambda表达式接收到一个参数,但没有返回值。
BiConsumer<T, U>
的等效代码为:vql8enpb3#
Function.identity()
能满足您的需求吗?返回始终返回其输入参数的函数。
k5ifujac4#
如果你想要一个不执行任何操作的方法的方法引用,最简单的方法就是编写一个不执行任何操作的方法。注意,在这个例子中,当需要
Consumer<String>
时,我使用了Main::doNothing
。您还可以通过提供使用varargs的版本来重载
doNothing
。这个签名可以接受任何参数序列(甚至是原语,因为它们会被自动装箱)。这样,只要函数接口的方法有
void
返回类型,你就可以传递Main::doNothing
。例如,当需要ObjLongConsumer<Integer>
时,你可以传递Main::doNothing
。nvbavucw5#
您可以拥有自己的NOOP实现,类似于Function.Identity。
v1uwarro6#
如果您想要 * 非常接近no-op* 的结果,可以使用
Objects::requireNonNull
。当然,使用
x -> {}
也可以,但是IDE的自动格式化程序可能会尝试将其拆分为多行。