2016-08-01 18 views
2

コードを書いたりライブラリを追加したりせずにコンシューマをチェーンで使用する方法はありますか? は、今では次のようだ:標準ライブラリを使用してコンシューマーに複数回適用する

Consumer s = str -> System.out.println(str); 
s.accept("abc"); 
s.accept("fgh"); 
s.accept("xyz"); 

Consumer s = str -> System.out.println("str"); 
s.accept("abc").accept("fgh").accept("xyz") 

のようなものにそれを有効にする方法はありますか?

答えて

1

Consumervoidを返すので、チェーン化できません。しかし、すべては、あなたが達成しようとしていることがどれほど複雑であるかにまで下がります。例えば、あなたの特定の例は、このような方法で書かれている可能性:

Stream.of("abc", "fgh", "xyz").forEach(System.out::println); 

文字列は、任意のオブジェクトと交換することができ、Consumerは、任意の複雑さのものとすることができます。しかし、あるチェーンのすべての値に対してコンシューマーを実行する必要がない場合、このアプローチはあなたに合っていません。

3

accept()voidを返すため、「すぐに使用できません」という質問はできません。 しかし、あなたはおそらくラッパーを作成して、あなたが望むことを行うことができます。たとえば:

class ChainedConsumer<T> { 

    private final Consumer<T> consumer; 

    public ChainedConsumer(final Consumer<T> consumer) { 
     this.consumer = consumer; 
    } 

    public ChainedConsumer<T> accept(final T s) { 
     this.consumer.accept(s); 
     return this; 
    } 
} 
+0

私は承諾が助けにならないことを知っています。しかし、おそらく私は消費者を適用し、それ自身を返す関数に、消費者をマップしたいと思うもののための標準的な方法がありますか? – maxpovver

+0

不明な点をご迷惑をおかけして申し訳ありませんが、私は質問を修正しました – maxpovver

1

お使いの環境では、Consumervoidから署名を変更し、独自のacceptメソッドを作成し、Builderパターンのように常にthisを返すことができるようになりますConsumerのラッパーを作成することを可能にする場合。

関連する問題