1. ホーム
  2. java

[解決済み] 述語による最初の要素の検索

2022-03-16 13:17:35

質問

私はJava 8のラムダを使い始めたばかりで、関数型言語で慣れ親しんできたことをいくつか実装しようとしています。

例えば、ほとんどの関数型言語には、シーケンスやリストを操作して最初の要素を返す、ある種のfind関数があり、それに対する述語は true . Java 8でこれを実現する方法はただ一つ。

lst.stream()
    .filter(x -> x > 5)
    .findFirst()

しかし、この方法は非効率的だと思います。もっといい方法はないでしょうか?

解決方法は?

いいえ、フィルタはストリーム全体をスキャンするわけではありません。これは中間処理であり、遅延ストリームを返す(実際にはすべての中間処理は遅延ストリームを返す)。次のようなテストをしてみてほしい。

List<Integer> list = Arrays.asList(1, 10, 3, 7, 5);
int a = list.stream()
            .peek(num -> System.out.println("will filter " + num))
            .filter(x -> x > 5)
            .findFirst()
            .get();
System.out.println(a);

どの出力か。

will filter 1
will filter 10
10

ストリームの最初の2つの要素だけが実際に処理されていることがわかります。

だから、あなたのやり方は全く問題ありません。