ПочемуПочему параллельные последовательности scala не имеют метода contains?
List.range(0,100).contains(2)
работы, в то время как
List.range(0,100).par.contains(2)
не ли?
Это планируется на будущее?
ПочемуПочему параллельные последовательности scala не имеют метода contains?
List.range(0,100).contains(2)
работы, в то время как
List.range(0,100).par.contains(2)
не ли?
Это планируется на будущее?
Ответ: Ответ: определен в SeqLike
, но не в ParSeqLike
.
Если это не удовлетворит ваше любопытство, вы можете обнаружить, что SeqLike
«s 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
определен на SeqLike
, а не на прадедушкой всех коллекций, GenTraversableOnce
, где вы найдете exists
? Возможная причина заключается в том, что contains
для Map
семантически отличается от метода Set
и Seq
. A Map[A,B]
- Traversable[(A,B)]
, поэтому, если contains
были определены для Traversable
, contains
необходимо было бы взять кортеж (A,B)
; однако Map
's contains
принимает только аргумент A
. Учитывая это, я думаю, contains
должен быть определен в GenSeqLike
- возможно, это надзор, который будет исправлен.
(Сначала я думал, что параллельные последовательности не имеют contains
, потому что поиск там, где вы собираетесь останавливаться после нахождения вашей цели в параллельных коллекциях, намного менее эффективен, чем линейная версия (различные потоки выполняют много ненужной работы после того, как значение найдено: см. this question), но это не может быть прав, потому что есть exists
.)
'indexOfSlice' будет иметь смысл, поскольку параллельные последовательности имеют порядок, просто они не выполняют параллельные операции в заказ. Но эффективный масштабируемый 'indexOfSlice' еще не реализован. – axel22
@ axel22 спасибо, обновлено. –
Спасибо, очень полезно! Я бы предположил, что они просто еще не реализовали его, потому что он не работает так, как вы ожидали, например, как только он найдет одно значение. – placeybordeaux