这可能听起来像一个奇怪的问题,但有没有办法在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的缺陷.
我正在看下面的Stack Overflow答案: 如何在运行时更改Spring的@Scheduled fixedDelay
在代码中有以下行:
schedulerFuture = taskScheduler.schedule(() -> { }, this);
Run Code Online (Sandbox Code Playgroud)
我想知道lambda () -> {}在该代码中的含义.我需要在不使用lambdas的情况下编写它.
我需要在代码块中使用流中的'n'项然后完成,实质上:
public static <T> void eat(Stream<T> stream, int n)
// consume n items of the stream (and throw them away)
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我无法改变签名返回Stream<T>简单return stream.skip(n); 我必须实际丢弃流中的一些元素(不是简单的逻辑) - 为下游消费者做好准备,这不需要知道这是怎么发生的,甚至不知道发生了什么.
最简单的方法是使用limit(n),但我必须调用流终止方法来激活流,所以本质上我有:
public static <T> void skip(Stream<T> stream, int n) {
stream.limit(n).forEach(t -> {});
}
Run Code Online (Sandbox Code Playgroud)
注意:此代码完全简化了实际代码,仅用于说明目的.实际上,限制将不起作用,因为存在围绕什么/如何消耗元素的逻辑.可以把它想象成从流中消费"header"元素,然后让消费者使用"body"元素.
这个问题是关于"无所事事"的lambda t -> {}.
在JDK中的某个地方是否有"无所事事"的消费者,比如"无所事事"功能Function.identity()?
我只是注意到Consumer没有identity()像有那样的方法java.util.function.Function。
是的,这只是一个可以放入东西的洞,但至少可以完全清楚地知道我不仅仅是在括号中遗漏了一些代码。
以这个人为的例子为例:
public void applyConsumerIfExists(String key, String param) {
Map<String, Consumer<String>> consumers = new HashMap<>();
consumers.put("a", MyClass::myConsumer);
// I can create my own, but that's no fun :(
Consumer<String> identity = input -> {};
consumers.getOrDefault(key, identity).accept(param);
// DOESN'T WORK, since identity() doesn't exist on Consumer
consumers.getOrDefault(key, Consumer.identity()).accept(param);
}
Run Code Online (Sandbox Code Playgroud)
问题
为什么没有Consumer方法identity呢?