Обратите внимание, что ваши примеры Option
и Seq
не эквивалентны: в первом случае, результатом является значение, которое было внутриOption
или пустая строка, в то время как в последнем случае, вы в конечном итоге возвращая коллекция сам, не его содержание.
Вы можете сделать эквивалент того, что вы сделали с Option
, с fold
в коллекциях, в зависимости от того, как вы хотите иметь дело с несколькими значениями в коллекции. Например:
seqOfStrings.foldLeft("") { _ + _ }
бы сцепить все строки в коллекции в одну длинную строку (вы можете получить тот же результат с seqOfStrings.mkString
). Обратите внимание, что это использует foldLeft
, а не fold
, потому что первый (предполагается) параллелизуемый и не гарантирует обработку результатов по порядку. Ниже приведен пример с fold
:
seqOfInts.fold(0) { _ + _ }
Это, конечно, такой же, как seqOfInts.sum
Идея fold
(левая/правая) комбинирует («складной») все элементы коллекции в одно значение.Option
- это особый случай, поскольку он может содержать только один элемент, поэтому функция трансформатора не должна принимать два аргумента и выглядит очень похожей на (противоположность) getOrElse
- таким образом, ваше замешательство.
То, что вы пытаетесь сделать с коллекцией, на самом деле не используется для сгиба. Вы можете использовать headOption
для того, как другие ответы предложили, или, еще лучше, шаблон матча:
col match {
case Seq() => None
case x => Some(Container("some description", x))
}
Вы можете обернуть его в объект компаньон, чтобы выглядеть красивее:
object Container {
def apply[T](seq: Seq[T]) = seq match {
case Seq() => None
case s => Container("some description", x))
}
}
Теперь вы можете просто сделайте Container(seq)
в другом месте.
Вы попробовали 'headOption'? Или 'headOption.map (anygoeshere)' – maks
Кроме того, 'if (opt.isEmpty)" "else opt.get' будет более идиоматичным с помощью' opt.getOrElse ("") ' – Dave
Почему' if/else' не «элегантный»? Для меня это прекрасно. Если вы не хотите «if/else» по какой-либо причине, вот один из способов: 'Some (col) .filter (_. NonEmpty) .map (c => Container (« некоторое описание », c))' – sjrd