【问题标题】:Why doesn't java.util.function.Consumer have identity()? [duplicate]为什么 java.util.function.Consumer 没有 identity()? [复制]
【发布时间】:2015-10-20 07:22:34
【问题描述】:

我刚刚注意到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);
}

问题

为什么Consumer 没有identity 方法?

【问题讨论】:

  • 我不会称之为identityemptynoAction 会更好地描述它。
  • 我认为,thisStuart Marks 对类似问题的回答也能回答您的问题。
  • 看来@TagirValeev 找到的答案实际上来自核心 JDK 开发人员,是最有启发性的答案。
  • 没有理由创建一个名为 identity 的局部变量。如果你只使用consumers.getOrDefault(key, x-&gt;{}).accept(param);,除了你的“有趣”方面之外,几乎没有预定义的无操作操作可以提供......

标签: java java-8


【解决方案1】:

为什么Consumer&lt;T&gt; 没有标识方法?

Consumer&lt;T&gt; 总是使用T 类型的对象并返回void

如果它有一个.identity() 方法,它应该使用void 并返回void,但它不可能使用void,因此没有这样的方法。

Function&lt;T, R&gt; 的区别在于TR 可以相同。 Consumer&lt;T&gt;有一个固定的结果类型void,不可能和consumed类型一样。

【讨论】:

  • 是的,但我认为OP真的想知道为什么没有内置的位桶。