#scala #scala-option
#scala #scala-option
Вопрос:
Итак, прямо сейчас у меня есть список объекта с необязательным полем, подобным этому, в scala
case class Foo(
id: String,
description: String,
OptionalTag: Option[String],
)
Я хочу перебирать список объектов и получать необязательные теги только в том случае, если они существуют, мой текущий подход таков
Tags = listOfFoos.map(foo =>
if (foo.OptionalTag.isDefined) {
foo.OptionalTag.get
} else {
""
}
).filter(_ != "" -> "")
Однако я уверен, что есть лучший способ сделать это, а затем дважды просмотреть весь список, но я не могу в этом разобраться.
Комментарии:
1.
val tags = foos.collect{case Foo(_,_,Some(tag)) => tag}
2.
listOfFoos.flatMap(_.OptionalTag)
Ответ №1:
Для конкретной проблемы, о которой вы упомянули, flatMap
это лучшее решение:
listOfFoos.flatMap(_.OptionalTag)
Если вы хотите выполнить более сложную обработку, collect
это лучший выбор, потому что он может выполнять работу как filter
и map
:
listOfFoos.collect{ case (_, _, Some(tag)) => "Tag is " tag }