Ben*_*Ben 58 java lambda functional-programming java-8
这可能听起来像一个奇怪的问题,但有没有办法在Java 8中引用Lambda的标准无操作(即null操作,空模式方法,无操作,无操作方法)方法.
目前,我有一个方法,需要一个,比方说,void foo(Consumer<Object>)我想给它一个无操作,我必须声明:
foo(new Consumer<Object>() {
public void accept(Object o) {
// do nothing
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里我希望能够做到这样的事情:
foo(Object::null)
Run Code Online (Sandbox Code Playgroud)
代替.有类似存在吗?
不确定多参数方法如何工作 - 也许这是Java中lambdas的缺陷.
fge*_*fge 49
这不是缺陷.
Java中的Lambda是功能接口的实例; 这,反过来,的Java构造可以被简化为被抽象到实例一个一个抽象方法,或SAM.
但是这个SAM仍然需要有一个有效的原型.在你的情况下,你想要一个无操作的Consumer<T>东西,什么都不做T.
但它仍然需要Consumer<T>; 这意味着您可以提出的最小声明是:
private static final Consumer<Object> NOOP = whatever -> {};
Run Code Online (Sandbox Code Playgroud)
并NOOP在您需要的地方使用.
And*_*ira 25
在您的特定情况下,您可以简单地做:
foo(i -> {});
Run Code Online (Sandbox Code Playgroud)
这意味着lambda表达式接收参数但没有返回值.
Old*_*eon 11
能Function.identity()满足您的需求?
返回一个始终返回其输入参数的函数.
如果你想要一个什么都不做的方法的方法引用,最简单的方法是编写一个什么都不做的方法.请注意,在此示例中,我已Main::doNothing在Consumer<String>需要时使用.
class Main {
static void doNothing(Object o) { }
static void foo(Consumer<String> c) { }
public static void main(String[] args) {
foo(Main::doNothing);
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以doNothing通过使用varargs提供版本来重载.
static void doNothing(Object... o) { }
Run Code Online (Sandbox Code Playgroud)
这个签名将接受任何参数序列(甚至原语,因为这些将被自动装箱).这样,Main::doNothing只要函数接口的方法具有void返回类型,就可以传递.例如,您可以Main::doNothing在ObjLongConsumer<Integer>需要时传递.
如果您想要非常接近无操作的东西,您可以使用Objects::requireNonNull.
使用x -> {}当然也可以,但是 IDE 的自动格式化程序可能会尝试将其分成多行。
您可以拥有自己的 NOOP 实现,类似于 Function.Identity。
static <T> Consumer<T> NOOP() {
return t -> {};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31619 次 |
| 最近记录: |