2012-06-01 1 views

ответ

10

Ответ: Ответ: определен в 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.)

+0

'indexOfSlice' будет иметь смысл, поскольку параллельные последовательности имеют порядок, просто они не выполняют параллельные операции в заказ. Но эффективный масштабируемый 'indexOfSlice' еще не реализован. – axel22

+0

@ axel22 спасибо, обновлено. –

+0

Спасибо, очень полезно! Я бы предположил, что они просто еще не реализовали его, потому что он не работает так, как вы ожидали, например, как только он найдет одно значение. – placeybordeaux

 Смежные вопросы

  • Нет связанных вопросов^_^