9

オプションでラップされたオブジェクトのプロパティである値を返したい場合がありますが、それは簡単にはできませんgetValue.orElse(otherValue)

たとえば、プロパティをインラインでマッピングしていて、のようなパターンを使用したいと考えていますobject.get.property.orElse("")。しかし、前のものはコンパイルされません。そのプロパティにアクセスし、オプションのような構文を維持するにはどうすればよいですか?

4

2 に答える 2

15

これを達成するために使用できます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}
于 2012-06-26T17:09:52.147 に答える
4

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)
于 2012-06-26T17:06:52.457 に答える