私は Java 8 ラムダを使い始めたばかりで、関数型言語で慣れているもののいくつかを実装しようとしています。
たとえば、ほとんどの関数型言語には、シーケンスまたはリストを操作して述語が である最初の要素を返す find 関数がありますtrue
。Java 8 でこれを実現する唯一の方法は、次のとおりです。
lst.stream()
.filter(x -> x > 5)
.findFirst()
しかし、少なくとも私の理解では、フィルターがリスト全体をスキャンするため、これは非効率的であるように思われます (間違っている可能性もあります)。もっと良い方法はありますか?
ベストアンサー1
いいえ、フィルターはストリーム全体をスキャンしません。これは中間操作であり、遅延ストリームを返します (実際にはすべての中間操作は遅延ストリームを返します)。納得してもらうために、次のテストを実行するだけです。
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 つの要素のみが実際に処理されることがわかります。
したがって、あなたは自分のやり方で進めば全く問題ありません。