【发布时间】:2017-10-06 12:57:24
【问题描述】:
我发现我的 Java 知识在 Java 8 中已经过时,并且我正在尝试学习许多新的语言特性。其中之一是函数,特别是 compose 和 andThen 方法。
我写了一个小实验来测试compose和andThen的可逆性:
/** Wraps a value
*/
public class Wrap<T> {
private final T value;
private Wrap(T value) {
this.value = value;
}
public static <T> Wrap<T> of(T value) {
return new Wrap<>(value);
}
}
static void functions() {
Function<Integer,String> itos = i->"'"+i+"'";
Function<String,Wrap<String>> stow = s->Wrap.of(s);
Function<Integer,Wrap<String>> itow = itos.andThen(stow);
Function<Integer,Wrap<String>> itow2 = stow.compose(itos);
System.out.println(itow.apply(3));
System.out.println(itow2.apply(3));
}
在上面的代码中,正如预期的那样,itow 和 itow2 两个函数似乎是等价的。但它们实际上是等价的吗?在这种情况下是否有相同的结果?
认为compose 和andThen 方法的存在是有原因的,并且函数或BiFunction 可能并不总是以这种方式可逆。你能想到可逆性不适用的任何情况吗?
【问题讨论】:
-
进一步思考,我对 BiFunction 感到困惑,当然他们没有 compose() 原因很明显。看起来函数实际上根本不需要 compose(),andThen() 在 IMO 上更直观。
标签: java function functional-programming