Каков наилучший способ получения списка полей из объекта?

#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 }