2016-04-19 6 views
0

私は今、ラムダlambdaをJavaで結合しますか?

(a, b) -> { 
    a.doSomething(); 
    a.doAnotherThing(); 
    return b.doSomething(); 
} 

を持っているが、これは単に1つのメソッドのパラメータとして使用されます。しかし、同様のラムダを作成したいと思います。

(a) -> { 
    a.doSomething(); 
    a.doAnotherThing(); 
    return a 
} 

私のコードを再利用できる方法はありますか?何かのように

(a, b) -> { 
    partial(a) 
    return b.doSomething(); 
} 

(a) -> { 
    partial(a) 
    return a; 
} 
+1

確かに。あなたを止めるのは何ですか? –

+0

...どのようにわからないのですか?正しいコードがどのようなものかわからない – Andrew

+0

これはあなたがすでに提案したものとまったく同じように見えます。メソッド 'partial(a)'を書くだけです。 –

答えて

0

私が正しく理解していれば、別のラムダからラムダを呼びたいのですか?

あなたはそれらに名前を与えると私はここにpartialのご使用は部分関数の関数型プログラミングの概念に言及されていないことを仮定してい

Function<X,Y> partial = (a) -> { 
    a.doSomething(); 
    a.doAnotherThing(); 
    return a; 
} 

BiFunction<X,Y,Z> lam = (a, b) -> { 
    partial.apply(a); 
    return b.doSomething(); 
} 
+0

' lam'のタイプは、 「BiFunction 」となります。 – saka1029

+0

おっと、ありがとう! –

+0

'partial(a)' - > 'partial.apply(a)'を編集しました。 – saka1029

0

他の関数のようにそれらを使用することができます。

例を見ると、aの操作は、値を返さないためコンシューマにすぎません。あなたの再利用可能なラムダはこのように宣言することができます:最初の消費者を呼び出す関数を構成するには

Consumer<A> partial = a -> { 
    a.doSomething(); 
    a.doAnotherThing(); 
} 

、あなたは便利なこのヘルパーを保つことができる:あなたはと同等の機能を構成するために使用することができ

static <T,U,R> BiFunction<T,U,R> acceptAndThen(Consumer<T> c, Function<U,R> f){ 
    return (t,u) -> { 
     c.accept(t); 
     return f.apply(u); 
    }; 
} 

このようなあなたの元の関数(私はb.doSomething()の戻り値の型を知らない、私はCを仮定します):

BiFunction<A,B,C> f1 = acceptAndThen(partial, B::doSomething); // equivalent to (a, b) -> { partial.accept(a); return b.doSomething(); } 

あなたの第二の例、あなたはを再利用する方法を示しています

Function<A,A> f2 = returnSelf(partial); // equivalent to (a) -> { partial.accept(a); return a; } 
:だから、あなたはこのようなあなたの第二の例を作成することができ

static <T> Function<T,T> returnSelf(Consumer<T> consumer){ 
    return t -> { 
     consumer.accept(t); 
     return t; 
    }; 
} 

:別の方法では、Consumer<T>が上で動作Tを返すことでFunction<T,T>Consumer<T>を変換し、別のヘルパーの恩恵を受けるだろう

これらのコンポジションは標準ライブラリにはありませんが、ConsumerおよびFunctionのようなインターフェイスには、既存の機能タイプを新しいものに組み込むための組み込み関数がいくつかあります。たとえば、Consumerには、消費者を連続して呼び出すことができるようにする関数andThenがあります。それを使って部分的に見えるかもしれません

Consumer<A> partial = ((Consumer<A>) A::doSomething).andThen(A::doAnotherThing); 
関連する問題