【问题标题】:Are there standardized generic functional interfaces in Java8?Java8 中是否有标准化的通用功能接口?
【发布时间】:2016-08-17 18:34:03
【问题描述】:

我想知道是否有人以及在哪里完成了定义一组通用功能接口以简化和标准化 lambda 的使用的工作。 我来自 C#,核心库完成了这项工作。

我读过“BiFunction”,发现它很笨拙。特别是当扩展到 TriFunction 等时。

我想出了以下内容:

public interface FI {
@FunctionalInterface
public interface Action<T> {
    void invoke(T arg1);
}
@FunctionalInterface
public interface Function0<TResult> {
    TResult invoke();
}
@FunctionalInterface
public interface Function1<Targ1, TResult> {
    TResult invoke(Targ1 arg1);
}
@FunctionalInterface
public interface Function2<Targ1, Targ2, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2);
}
@FunctionalInterface
public interface Function3<Targ1, Targ2, Targ3, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3);
}
@FunctionalInterface
public interface Function4<Targ1, Targ2, Targ3, Targ4, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4);
}
@FunctionalInterface
public interface Function5<Targ1, Targ2, Targ3, Targ4, Targ5, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5);
}
@FunctionalInterface
public interface Function6<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6);
}
@FunctionalInterface
public interface Function7<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7);
}
@FunctionalInterface
public interface Function8<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 atg8);
}
@FunctionalInterface
public interface Function9<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 atg8, Targ9 arg9);
}
@FunctionalInterface
public interface Function10<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, Targ10, TResult> {
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 atg8, Targ9 arg9, Targ10 arg10);
}

}

【问题讨论】:

  • 标准 Java 库中没有与此完全相同的内容;最接近的是包中的接口java.util.function
  • 嗯...你的Action 基本上是ConsumerFunction0SupplierFunction1FunctionFunction2BiFunction。其余的可能用处非常有限。如果您正在编写具有 10 个参数的函数,那么可能有更好的方法来编写它。
  • 一个有 10 个参数的函数应该有一个类来包装这些值。
  • 我以前写过自己的 TriFunction,但每次都给它起了一个更具体、更有意义的名字。
  • 我同意 10 个参数太多。但作为图书馆作者,如果可能的话,不应将自己的意见强加给图书馆用户。

标签: java functional-interface


【解决方案1】:

javaslang[1] 提供Function0-Function8 甚至CheckedFunction0-CheckedFunction8。它们甚至提供了额外的功能,如“记忆”和“柯里化”。

http://javaslang.io

【讨论】:

    【解决方案2】:

    在 Java 8 中,官方只存在 4 种函数。

      Consumer: Void function
      Function: receive argument return argument
      BiFunction: Receive 2 arguments return argument
      Predicate: receive argument return boolean
    

    在这里你可以看到一些关于它的例子。

    https://github.com/politrons/reactive/blob/master/src/test/java/stream/Functions.java

    【讨论】:

    • 是的,这就是我发现的。
    • 谓词接收 1 个参数
    【解决方案3】:

    您会在java.util.function 包中找到最接近的类似物:

    interface Function<T,R> { R apply(T t) }
    
    interface Consumer<T> { void accept(T t) }
    
    interface BiFunction<T,U,R> { R apply(T t, U u) }
    

    等等。您可以定义自己的,也可以在 Google Guava 或其他库中找到一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多