是否有可用于任何 lambda 的空操作 (NOP) 的方法参考?
Is there a method reference for a no-op (NOP) that can be used for anything lambda?
这听起来像是一个奇怪的问题,但是有没有办法在Java8.
目前,我有一个方法需要一个,比如说,void foo(Consumer<Object>)
,我想给它一个空操作,我必须声明:
foo(new Consumer<Object>() {
public void accept(Object o) {
// do nothing
}
}
我希望能够执行以下操作的地方:
foo(Object::null)
相反。是否存在类似的东西?
不确定如何使用多参数方法 - 也许这是 Java 中 lambda 的缺陷。
这不是缺点。
Java 中的 Lambda 是函数式接口的实例;反过来,它们被抽象为 Java 构造的实例,可以简化为 one 单个抽象方法,或 SAM。
但是这个SAM还需要有一个有效的原型。在你的情况下,你想要一个空操作 Consumer<T>
它什么都不做 T
.
但是仍然需要 Consumer<T>
;这意味着您可以提出的最小声明是:
private static final Consumer<Object> NOOP = whatever -> {};
并在需要的地方使用 NOOP
。
在您的特定情况下,您可以简单地执行以下操作:
foo(i -> {});
这意味着 lambda 表达式接收了一个参数但没有 return 值。
BiConsumer<T, U>
的等效代码为:
void bifoo(BiConsumer<Object, Object> consumer) { ... }
bifoo((a, b) -> {});
能否Function.identity()
满足您的需求?
Returns a function that always returns its input argument.
如果您想要一个什么都不做的方法的方法引用,最简单的方法是编写一个什么都不做的方法。请注意,在本例中,当需要 Consumer<String>
时,我使用了 Main::doNothing
。
class Main {
static void doNothing(Object o) { }
static void foo(Consumer<String> c) { }
public static void main(String[] args) {
foo(Main::doNothing);
}
}
您还可以通过提供使用可变参数的版本来重载 doNothing
。
static void doNothing(Object... o) { }
此签名几乎可以接受任何参数序列(甚至是原始参数,因为这些参数将被自动装箱)。这样,只要功能接口的方法具有 void
return 类型,您就可以传递 Main::doNothing
。例如,您可以在需要 ObjLongConsumer<Integer>
时传递 Main::doNothing
。
您可以拥有自己的 NOOP 实现,类似于 Function.Identity。
static <T> Consumer<T> NOOP() {
return t -> {};
}
如果您想要非常接近no-op的东西,并且您已经在类路径中安装了 Guava,则可以使用 Preconditions::checkNotNull
.
使用 x -> {}
当然也可以,但是您的 IDE 的 auto-formatter 可能会尝试将其分成多行。
这听起来像是一个奇怪的问题,但是有没有办法在Java8.
目前,我有一个方法需要一个,比如说,void foo(Consumer<Object>)
,我想给它一个空操作,我必须声明:
foo(new Consumer<Object>() {
public void accept(Object o) {
// do nothing
}
}
我希望能够执行以下操作的地方:
foo(Object::null)
相反。是否存在类似的东西?
不确定如何使用多参数方法 - 也许这是 Java 中 lambda 的缺陷。
这不是缺点。
Java 中的 Lambda 是函数式接口的实例;反过来,它们被抽象为 Java 构造的实例,可以简化为 one 单个抽象方法,或 SAM。
但是这个SAM还需要有一个有效的原型。在你的情况下,你想要一个空操作 Consumer<T>
它什么都不做 T
.
但是仍然需要 Consumer<T>
;这意味着您可以提出的最小声明是:
private static final Consumer<Object> NOOP = whatever -> {};
并在需要的地方使用 NOOP
。
在您的特定情况下,您可以简单地执行以下操作:
foo(i -> {});
这意味着 lambda 表达式接收了一个参数但没有 return 值。
BiConsumer<T, U>
的等效代码为:
void bifoo(BiConsumer<Object, Object> consumer) { ... }
bifoo((a, b) -> {});
能否Function.identity()
满足您的需求?
Returns a function that always returns its input argument.
如果您想要一个什么都不做的方法的方法引用,最简单的方法是编写一个什么都不做的方法。请注意,在本例中,当需要 Consumer<String>
时,我使用了 Main::doNothing
。
class Main {
static void doNothing(Object o) { }
static void foo(Consumer<String> c) { }
public static void main(String[] args) {
foo(Main::doNothing);
}
}
您还可以通过提供使用可变参数的版本来重载 doNothing
。
static void doNothing(Object... o) { }
此签名几乎可以接受任何参数序列(甚至是原始参数,因为这些参数将被自动装箱)。这样,只要功能接口的方法具有 void
return 类型,您就可以传递 Main::doNothing
。例如,您可以在需要 ObjLongConsumer<Integer>
时传递 Main::doNothing
。
您可以拥有自己的 NOOP 实现,类似于 Function.Identity。
static <T> Consumer<T> NOOP() {
return t -> {};
}
如果您想要非常接近no-op的东西,并且您已经在类路径中安装了 Guava,则可以使用 Preconditions::checkNotNull
.
使用 x -> {}
当然也可以,但是您的 IDE 的 auto-formatter 可能会尝试将其分成多行。