Java 8部分函数应用/货币化 公共静态函数部分(双函数f,tx){ 返回(y)->f.apply(x,y); }

Java 8部分函数应用/货币化 公共静态函数部分(双函数f,tx){ 返回(y)->f.apply(x,y); },java,lambda,currying,partial-application,Java,Lambda,Currying,Partial Application,在上面的表达式中,我可以理解函数partial返回另一个函数,function。该函数本身返回一个R值。其余的static代表什么?我的意思是,如果函数返回一个R,那么它的处理方法是什么?(我知道它在Java术语中在技术上是不正确的,但我将在下面说“参数”,这里我指的是“形式参数”,因为混合使用“形式参数”和“类型参数”到处都是令人困惑的。) T是x参数的类型参数 partial接受两个参数: f,一种接受T和U并返回R的函数:双函数f x,类型为T:tx partial返回一个新函数,该函

在上面的表达式中,我可以理解函数partial返回另一个函数,
function
。该
函数本身返回一个R值。其余的
static
代表什么?我的意思是,如果
函数
返回一个R,那么它的处理方法是什么?

(我知道它在Java术语中在技术上是不正确的,但我将在下面说“参数”,这里我指的是“形式参数”,因为混合使用“形式参数”和“类型参数”到处都是令人困惑的。)

T
x
参数的类型参数

partial
接受两个参数:

  • f
    ,一种接受
    T
    U
    并返回
    R
    的函数:
    双函数f

  • x
    ,类型为
    T

    tx

partial
返回一个新函数,该函数只接受
U
(不是
T
U
)并返回
R
。在调用
f
时,新函数使用提供给
partial
x
而不是
T
参数

简而言之:它返回一个新函数,其中第一个参数(类型为
T
)已通过
partial
x
参数部分应用(curry)


我们之所以在声明的开头有
,是因为Java语法允许我们指定
partial
是一种通用方法,使用类型参数
T
U
R
(否则,它们看起来像类型名,而不是类型参数)。

类型参数。阅读Java中的泛型。那些
告诉Java,
T
U
R
不应该是实际的类,而是泛型类的占位符。任何添加泛型类型参数的方法都必须在返回类型之前声明它们。静态方法不会从它们所在的类继承任何泛型类型参数,因此必须在返回类型之前声明它们的所有类型参数。当您看到具有与父类相同的类型参数的静态方法时,它们命名相同只是巧合。因此,T、U和R只是方法参数和返回类型中使用的所有泛型类型的集合。@mirowth,如果您有一个类MyClass和一个使用a、B和另一个类型参数C的成员函数,则该成员函数可以声明为类似“public returnType…”。它只需要声明额外的类型参数C,因为A和B已经定义为类类型参数。静态函数不能从类继承A和B,因此它必须在返回类型之前列出它们,即“publicstaticreturntype…”。顺便说一句,api中的类型参数有一个命名约定。通常,但并非总是,R是返回值的类型,而T和U(如果需要)是参数类型。当返回类型与param类型相同时,例如使用UnaryOperator和BinaryOperator,它只是“static”中的Tso,T被替换为“BiFunction f”和U=“T x”?@microwth:No、
T
U
R
,以在调用该方法时指定这些类型参数的具体类型。
partial
所做的是返回一个接受
U
并返回
R
的函数,该函数调用原始函数,接受
T
U
,并返回
R
,指定值为
x
。例如,如果我有一个方法
Widget foo(String,List)
,我可以使用
partial
获得一个``Widget partialFoo(List)`,它将调用
foo
,并将
x
作为字符串。泛型教程中有更多内容:@t-j-crowder“调用原始函数”你是说函数“f”?这就像“return(y)->f.apply(x,y);”是“函数”,然后,当f.apply(x,y)运行时,它返回一个值,所以它变成return(y)->value,这是一个满足静态条件的函数。正确吗?@microwth:
(y)->f.apply(x,y)
创建一个函数,这就是
partial
返回的函数。该函数接受
y
。函数体有效地
返回f.apply(x,y)partial
返回时,它调用
f
,将
x
(您为第一个参数指定的
partial
)和
y
(调用函数
partial
返回时指定的)作为第二个参数传入,然后返回
f
返回的任何内容。
 public static <T, U, R> Function<U, R> partial(BiFunction<T, U, R> f, T x) {
        return (y) -> f.apply(x, y);
    }