Scala: seq.size против сопоставления с образцом - PullRequest
0 голосов
/ 15 марта 2020

Я должен принять решение на основе размера Seq.

Итак, я могу сделать:

if(mySeq.size() > 0) // do your stuff

Или я могу сделать:

mySeq match {
  case x :: _ => // do your stuff
}

Какой из них я предпочитаю?

Ответы [ 2 ]

6 голосов
/ 15 марта 2020

Если ваш чек имеет размер> 0 или нет, я предпочитаю

if (mySeq.nonEmpty) { .. }

Это решение без потери производительности и работает для всех версий scala. На мой взгляд, nonEmpty более интуитивно понятен, чем проверка размера.

4 голосов
/ 15 марта 2020

Seq является абстракцией базового типа коллекции. Это создает несколько проблем.

case x :: _ => не будет работать, если базовый набор не равен List, но вы можете изменить его на case x +: _ => для более универсального покрытия.

mySeq.size может быть достаточно эффективным, если базовая коллекция похожа на Vector, но это линейная операция на List.

. Я бы рекомендовал использовать mySeq.sizeIs > 0 (Scala 2.13). sizeIs предназначен для завершения, как только может быть определено сравнение, поэтому даже на List он должен возвращать true после прохождения только одного элемента.

...