仅使用函数实现组合<&燃气轮机;在Java8中
在本书中,作者仅使用仅使用函数实现组合<&燃气轮机;在Java8中,java,lambda,functional-programming,java-8,Java,Lambda,Functional Programming,Java 8,在本书中,作者仅使用函数接口构建了一个compose函数(尽管该接口不是Java8附带的接口,但非常类似),其片段如下所示 public interface Function<T, U> { U apply(T arg); } 公共接口功能{ U应用(T参数); } 虽然我可以理解下面的compose方法版本,它接受2个函数并返回一个composed函数 public static final Function<Integer, Integer> compose
函数
接口构建了一个compose函数(尽管该接口不是Java8附带的接口,但非常类似),其片段如下所示
public interface Function<T, U> {
U apply(T arg);
}
公共接口功能{
U应用(T参数);
}
虽然我可以理解下面的compose方法版本,它接受2个函数并返回一个composed函数
public static final Function<Integer, Integer> compose (final Function<Integer, Integer> f1,
final Function<Integer, Integer> f2) {
arg -> f1.apply(f2.apply(arg));
}
公共静态最终函数组合(最终函数f1,
最终功能(f2){
arg->f1.apply(f2.apply(arg));
}
我只是无法理解下面的compose实现中的函数和lambdas
static Function<Function<Integer, Integer>,
Function<Function<Integer, Integer>,
Function<Integer, Integer>>> compose =
x -> y -> z -> x.apply(y.apply(z));
静态函数组合=
x->y->z->x.apply(y.apply(z));
PS:我无法忘记这一点,继续往下看剩下的部分:(将
函数
称为整数函数,这里有一个函数将{a integer Function}映射到{a函数将整数函数映射到另一个整数函数}
具体地说,当给定一个整数函数x
时,它返回一个函数,给定一个整数函数y
,它返回一个整数函数,该函数将整数z
映射到x(y(z))
给定一个函数x
返回一个函数,该函数:
给定一个函数y
返回一个函数,该函数:
给定一个整数z
返回x(y(z))
让我使用一个更简单的λ-符号省略类型,其中λx.E
表示一个函数,它接受一个参数x
并返回E
的值。例如,λx.λy.x+y
是一个接受x
并返回λy.x+y
的函数,它本身就是一个接受y
的函数并且返回x+y
。让我们也为一个函数编写λ(x,y)。E
,该函数同时接受两个参数x
和y
,并返回E
的值。例如,λ(x,y)。x+y
是一个函数,它同时接受x
和y
,并返回x+y
然后,compose的“同时两个参数”版本是:λ(f,g)。λx.f(g(x))
第二个“逐个”版本是:λf.λg.λx.f(g(x))
Java代码中所有看起来可怕的东西都只是类型注释。f
和g
(以及compose
的结果)让类型Function
。让我们把这个类型写成T
。然后第二个版本的compose有类型Function
p.S.函数如λx.λy.E
称为curried,而λ(x,y).E
称为uncarried。请参阅:使用不同类型和/或泛型,这种类型的说明可能更有意义
Function<Function<R, S>,
Function<Function<T, R>,
Function<T, S>>> compose = x -> y -> z -> x.apply(y.apply(z));
函数compose=x->y->z->x.apply(y.apply(z));
编辑:类型的位置不正确(这就是为什么当它们不同时,这是一个更好的练习)可能会看到如何用给定的函数组合两个fxn,但关注的是如何实现该组合函数这确实缺少C指针!