【问题标题】:Is there a standard way to convert a java.util.function,Consumer<T> into a java.util.function.Function<T, Void>是否有标准方法将 java.util.function,Consumer<T> 转换为 java.util.function.Function<T, Void>
【发布时间】:2020-02-07 15:25:58
【问题描述】:

我有一个Consumer&lt;T&gt;,我想将其转换为Function&lt;T, Void&gt;

我可以通过使用来实现这一点

public <T> Function<T, Void> consumerToFunction(Consumer<T> consumer)
{
    return x -> {
        consumer.accept(x);
        return null;
    };
}

但我怀疑类似的东西可能已经存在于 JDK 或公共库中。

【问题讨论】:

  • 不,我不这么认为,这对我来说是正确的。也就是说——你为什么要这个? Functions 通常应该没有副作用。
  • consumer::accept?编辑:nope,void 不能转换为 Void。此外,VoidT 的顺序错误。
  • 我有一个Consumer&lt;T&gt; 实例,而我使用的API 需要Function&lt;T, R&gt;。电话最终将R 返还给我。我不需要那个R,可以放心地忽略它。
  • 我唯一要改变的就是把 lambda 表达式放在你调用 consumerToFunction 的地方,然后去掉那个方法……
  • 我最近的案例是java.util.concurrent.CompletableFuture.exceptionally(Function&lt;Throwable, Void&gt;)(即从没有返回值的可完成未来抛出的异常的处理程序)。

标签: java java-8


【解决方案1】:

您似乎需要将 Consumer&lt;T&gt; 调整为 Function&lt;T, R&gt;。您创建了一个很好的 Adapter Pattern 示例。

[T]适配器模式是一种软件设计模式,允许从另一个接口使用现有类的接口。

您让ConsumerFunction 使用。

我知道功能接口之间没有 JDK 内置转换器,但这似乎是应用标准模式解决问题的好方法。

【讨论】:

    【解决方案2】:

    标准方法不存在,但这应该可以解决问题:

    Function<T, Void> adapt(final Consumer<T> consumer) {
        return t -> {
            consumer.accept(t);
            return null;
        };
    }
    

    这是遵循@rgettman 中的accepted answer 中提到的适配器模式。

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 2014-11-09
      • 2012-07-22
      • 1970-01-01
      • 2012-03-10
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多