web-dev-qa-db-ja.com

JDKはダミーのコンシューマーを提供しますか?

本質的に、ストリームから 'n'アイテムを消費して終了するコードブロックが必要です。

_ public static <T> void eat(Stream<T> stream, int n) 
     // consume n items of the stream (and throw them away)
 }
_

私の状況では、署名を変更して_Stream<T>_を返し、単にreturn stream.skip(n);を返すようにすることはできません。ストリームからいくつかの要素を実際に破棄する必要があります(単純なロジックではありません)。これがどのように、あるいはそれが起こったのかを知る必要のない下流のコンシューマーの準備をするためです。

これを行う最も簡単な方法はlimit(n)を使用することですが、ストリームをアクティブにするためにストリーム終了メソッドを呼び出す必要があるため、基本的には次のようになります。

_public static <T> void skip(Stream<T> stream, int n) {
    stream.limit(n).forEach(t -> {});
}
_

注:このコードは、実際のコードを単純化したものであり、説明のみを目的としています。実際には、要素をどのように/どのように使用するかに関するロジックがあるため、制限は機能しません。ストリームから「header」要素を消費し、コンシューマーに「body」要素を消費させるようなものだと考えてください。

この質問は、「何もしない」ラムダ_t -> {}_についてです。

「何もしない」関数Function.identity()のように、JDKのどこかに「何もしない」コンシューマはありますか?

31
Bohemian

いいえ、JDKは、ダミーのコンシューマだけでなく、ダミーの実行可能、常に真の述語、または常にゼロを返すサプライヤなどの他の定義済み関数も提供していません。書くだけ t -> {}、とにかく同じことをする準備ができたメソッドを呼び出すよりも短いです。

18
Tagir Valeev