オプションでラップされたオブジェクトのプロパティである値を返したい場合がありますが、それは簡単にはできませんgetValue.orElse(otherValue)。
たとえば、プロパティをインラインでマッピングしていて、のようなパターンを使用したいと考えていますobject.get.property.orElse("")。しかし、前のものはコンパイルされません。そのプロパティにアクセスし、オプションのような構文を維持するにはどうすればよいですか?
オプションでラップされたオブジェクトのプロパティである値を返したい場合がありますが、それは簡単にはできませんgetValue.orElse(otherValue)。
たとえば、プロパティをインラインでマッピングしていて、のようなパターンを使用したいと考えていますobject.get.property.orElse("")。しかし、前のものはコンパイルされません。そのプロパティにアクセスし、オプションのような構文を維持するにはどうすればよいですか?
これを達成するために使用できますmap()。0個または1個の要素を保持できるOption[T]タイプのコンテナのように考え始めると、明らかになります。T
case class Person(name: String, age: Int)
val optionalPerson = Some(Person("John", 29))
val name = optionalPerson map {_.name} getOrElse "?"
さらに、sのネストされた構造がある場合Option:
case class Person(name: String, age: Int, parent: Option[Person])
Optionネストされたものを抽出できますflatMap:
val optionalPerson = Some(Person("John", 29, Some(Person("Mary", 55, None))))
val parentName = optionalPerson flatMap {_.parent} map {_.name} getOrElse "Unknown parent name" //Mary
または、ラップされた値がいくつかの基準を満たさない場合に変換するために使用できfilter()ます。Some()NoneSome
val nameIfAdult = optionalPerson filter {_.age >= 18} map {_.name}
map()オプションのようなパターンを維持するために使用します。
たとえばname、オブジェクトのプロパティを取得する必要がありfieldます。ただし、フィールドが実際Noneに の場合は、空白の文字列を返すことができます。このような:
field.map(_.name).getOrElse("")
そして、それを全体像で使用する:
implicit def castDraftModel(drafts:List[Tuple2[models.ReportInstance,Option[models.Report]]]) = drafts.map{
(field) =>
List(Field(
field._1.id,
field._1.teamId,
field._2.map(_.name).getOrElse(""),
field._1.lastModifiedRelative,
field._2.map(_.id).getOrElse(0L),
field._2.map(_.reportType).getOrElse(""),
field._1.referenceId,
field._1.referenceName( draft._2.map(_.reportType).getOrElse("") ) ))
}.flatten.sortBy(_.id)