2017-03-17 7 views
1
私は例えば、 andThencompose機能を使用してラムダ式の構成を行う方法を学習してきた

どのように実行するJavaのラムダ関数分解

Function<SceneObject> transform = scaleX2.andThen(scaleY2).andThen(rotateZ45); 

内のいずれかの手順を削除する方法はあります結果の関数?

したがって、上記の例では、transform.decompose(scaleY2)transform = scaleX2.andThen(rotateZ45)になります。

+0

だれが言ったのですか? 'scaleY2'が' Integer :: parseInt'で 'rotateZ45'が' Math :: abs'ならばどうですか? – shmosel

+0

幸いなことに、このようなことをすることはできません。それは、ひどく維持不能なコードにつながるからです。別の機能の中で機能の一部を削除するだけでいいのです。上記の例では、異なる部分が何であるかを知っているので意味があるかもしれませんが、一般的には、他の関数がどのような関数で構成されているかどうかはわかりません。 – lukens

答えて

0

このコードはありません。 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); 
    } 
} 
関連する問題