このコードはありません。 Function.andThen
は、ラムダ式を構築することによって実装され、ラムダ式を構築するために使用された2つの関数の詳細を完全に隠す。
別の方法として、等価な関数をラップすることができる独自の型を使用することができます(例えば、Transform<T, R>
)。分解操作をサポートすることができます。
import java.util.Optional;
@FunctionalInterface
public interface Transform<T, R> {
class AndThen<T, R, S> implements Transform<T, S> {
final Transform<T, R> first;
final Transform<R, S> second;
AndThen(Transform<T, R> first, Transform<R, S> second) {
this.first = first;
this.second = second;
}
@Override
public S apply(T t) {
return second.apply(first.apply(t));
}
@Override
public <U> Optional<Transform<T, U>> decomposeFst() {
return Optional.of((Transform<T, U>)first);
}
@Override
public <U> Optional<Transform<U, S>> decomposeSnd() {
return Optional.of((Transform<U, S>)second);
}
}
default <S> Transform<T, S> andThen(Transform<R, S> next) {
return new AndThen<T, R, S>(this, next);
}
R apply(T t);
default <S> Optional<Transform<T, S>> decomposeFst() {
return Optional.empty();
}
default <S> Optional<Transform<S, R>> decomposeSnd() {
return Optional.empty();
}
static void main(String[] args) {
final Transform<Double, String> f = Object::toString;
final Transform<String, Integer> g = String::length;
final Transform<Double, Integer> h = f.andThen(g);
final int i = h.apply(1.234);
final Optional<Transform<Double, String>> f2 = h.<String>decomposeFst();
final Optional<Transform<String, Integer>> g2 = h.<String>decomposeSnd();
final String s = f2.get().apply(1.234);
final int j = g2.get().apply(s);
System.out.println(s + " : " + j);
}
}
だれが言ったのですか? 'scaleY2'が' Integer :: parseInt'で 'rotateZ45'が' Math :: abs'ならばどうですか? – shmosel
幸いなことに、このようなことをすることはできません。それは、ひどく維持不能なコードにつながるからです。別の機能の中で機能の一部を削除するだけでいいのです。上記の例では、異なる部分が何であるかを知っているので意味があるかもしれませんが、一般的には、他の関数がどのような関数で構成されているかどうかはわかりません。 – lukens