他の関数のようにそれらを使用することができます。
例を見ると、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);
確かに。あなたを止めるのは何ですか? –
...どのようにわからないのですか?正しいコードがどのようなものかわからない – Andrew
これはあなたがすでに提案したものとまったく同じように見えます。メソッド 'partial(a)'を書くだけです。 –