【问题标题】:Is there a pre-Java-8 functional interface that's a drop in replacement for java.util.function.Consumer<T>?是否有一个 Java-8 之前的功能接口可以替代 java.util.function.Consumer<T>?
【发布时间】:2014-03-03 21:35:32
【问题描述】:

由于期待迁移到 Java 8,我正在尝试以有利于使用 lambda 的方式编写代码。

我需要一个具有单一方法的功能接口,该方法采用某种类型的参数T 并返回void。这是java.util.function.Consumeraccept()方法的签名,当然我还不能用。

标准 Java 7(最好是 Java 6)API 中是否有其他接口可供我使用?我知道我可以创建自己的,但尤其是。在将此代码移植到 Java 8 之前,如果我可以使用标准 Java 6/7 API 中已经熟悉的标准接口,则可读性会更好。

到目前为止,我发现的最接近的东西是 com.google.common.base.Function&lt;T,Void&gt;,但是 (a) 它不是标准 Java API 的一部分,并且 (b) 它的文档说“函数的实例通常应该是引用透明的——不副作用”,这与我的预期用途相反(返回类型为Void)。

【问题讨论】:

  • 您可以在任何有功能接口的地方使用 lambda,这是一个只有一种方法的接口。如果您想对代码进行建模以便更容易与 lambda 一起使用,请尽可能使用更多功能接口。
  • 如果有这样的界面你就知道了。与一个名为 Consumer 的新接口相比,一个你从未听说过的深奥的接口如何提高可读性,就像它匹配的 Java8 接口一样?
  • 我只是从 jdk8 的消费者复制粘贴代码(删除任何 Java-8 特定的注释)。当您迁移到 Java 8 时,您只需将匿名类替换为 lambda,并删除对您自己的 Consumer 类的导入。
  • 如果您自己的Consumer 的单个方法与Java 8 Consumer 具有相同的名称和签名,您可以在过渡阶段使您的接口成为Consumer 的子接口。

标签: java interface lambda java-8


【解决方案1】:

您可以创建自己的界面:

public interface Invokable <T>{
    public void invoke(T param);
}

或者,按照建议,您可以使用与 Java 8 Consumer 相同的接口。源代码包含在 Java 8 JDK Early Access 下载中,此处删除了所有 cmets 和注释:

public interface Consumer<T>{
    void accept(T t)
    default Consumer<T> andThen(Consumer<? super T> after)
}

【讨论】:

  • 最好将其命名为 Consumer 并将方法命名为 accept,然后当 Java 8 出现时,您可以摆脱您的方法。 (P.S. 你的Invoke 方法应该命名为invoke。)
  • 感谢您的案例修复,我在 C# 中根深蒂固 =(
  • @Holger 的评论是正确的,正如 @jpvee 的答案的晦涩难懂所示。 :) 看来现在最好只克隆Consumer,并在更新到Java 8 后将其替换为库存版本。
  • 这家伙值得喝啤酒!感谢提醒简单的java概念。
【解决方案2】:

哈,找到了!查看 JavaEE 7 API:接口javax.websocket.MessageHandler.Whole 应该是您正在寻找的。​​p>

【讨论】:

  • 由于我的回答被指责过于晦涩,我应该补充一点,MessageHandler.Whole 是唯一(相信我,我检查过!)接口,它是 JavaSE 7 和 JavaEE 7 API 的一部分,它是功能性的,即定义一个方法,它接受一个泛型参数并返回void(并且不抛出检查异常)。但是,我同意,使用它而不是 Consumer 接口是否是一个好主意是值得怀疑的 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多