なぜ
List.range(0,100).contains(2)
働きながら
List.range(0,100).par.contains(2)
ではない?
これは将来の予定ですか?
なぜ
List.range(0,100).contains(2)
働きながら
List.range(0,100).par.contains(2)
ではない?
これは将来の予定ですか?
非目的論的な答えは、 で定義されているcontains
が で定義されてSeqLike
いないためですParSeqLike
。
それがあなたの好奇心を満足させない場合は、が次SeqLike
のcontains
ように定義されていることがわかります。
def contains(elem: Any): Boolean = exists (_ == elem)
だからあなたの例のためにあなたは書くことができます
List.range(0,100).par.exists(_ == 2)
ParSeqLike
他のいくつかのメソッドも欠落しており、その中には効率的に実装するのが難しいもの (例: indexOfSlice
) や、あまり明白でない理由 (例:combinations
それは小さなデータセットでのみ役立つため) があります。ただし、並列コレクションがある場合は.seq
、線形バージョンに戻ってメソッドを元に戻すために使用することもできます。
List.range(0,100).par.seq.contains(2)
ライブラリの設計者がそれを省略した理由については... 私は完全に推測していますが、単純化のためにメソッドの数を減らしたかったのかもしれませんexists
。
これはまた、すべてのコレクションの祖父ではなく、なぜ がcontains
定義されているのかという疑問を提起します。考えられる理由は、forが意味的に onおよび とは異なるメソッドであることです。Aは であるため、に対して定義されている場合、タプル引数を取る必要があります。ただし、 は引数だけを取ります。これを考えると、で定義されるべきだと思います-多分これは修正される見落としです。SeqLike
GenTraversableOnce
exists
contains
Map
Set
Seq
Map[A,B]
Traversable[(A,B)]
contains
Traversable
contains
(A,B)
Map
contains
A
contains
GenSeqLike
contains
(最初は、並列コレクションでターゲットを見つけた後に停止する場所を検索するのは、線形バージョンよりもはるかに効率が悪いため、並列シーケンスにはないのではないかと思いました(値が見つかった後、さまざまなスレッドが多くの不要な作業を行います) :この質問を参照してください) exists
。