В чем разница между размером и длиной Seq? Когда использовать один и другой?
scala> var a :Seq[String] = Seq("one", "two")
a: Seq[String] = List(one, two)
scala> a.size
res6: Int = 2
scala> a.length
res7: Int = 2
То же самое?
Спасибо
В чем разница между размером и длиной Seq? Когда использовать один и другой?
scala> var a :Seq[String] = Seq("one", "two")
a: Seq[String] = List(one, two)
scala> a.size
res6: Int = 2
scala> a.length
res7: Int = 2
То же самое?
Спасибо
Ничего. В Seq doc в методе размера четко указано: "Размер этой последовательности, эквивалентный length
.".
size
определяется в GenTraversableOnce
, тогда как length
определяется в GenSeqLike
, поэтому length
существует только для Seq
s, тогда как size
существует для всех Traversable
s. Однако для Seq
s, как уже указывалось, size
просто делегирует length
(что, вероятно, означает, что после встраивания вы получите одинаковый байт-код).
Ничего, один делегирует другому. См. Свойство SeqLike.
/** The size of this $coll, equivalent to `length`.
*
* $willNotTerminateInf
*/
override def size = length
В Seq они такие же, как и другие. Однако, для информации, это то, что IntelliJ предупреждает о scala.Array
:
Замените .size на .length на массивах и строках
Информация о проверке: эта проверка сообщает о вызовах array.size и string.size. Хотя такие вызовы являются законными, они требуют дополнительного неявного преобразования в SeqLike. Распространенным вариантом использования будет длина вызова для массивов, и строки могут обеспечить значительные преимущества.
Я провел эксперимент с использованием Scala версии 2.12.8 и списка миллионов предметов. При первом использовании length() в 7 или 8 раз быстрее, чем size(). Но со второй попытки в том же списке size() примерно такой же скорости, как length().
Однако через некоторое время, по-видимому, кеш исчезает, size() снова медленно() в 7 или 8 раз.
Это показывает, что length() является предпочтительным для последовательностей. Это не просто другое название для size().