Case类的Scala可选参数

时间:2017-10-16 19:43:44

标签: scala

implicit val formats = DefaultFormats
val p = each_rsvp.extract[RSVPData]
p.venue.getOrElse(default = None)

我使用案例类完成了提取。 RSVPData是一个案例类,定义如下:

case class RSVPData(
                     venue: Option[VenueDetails] = None,
                     visibility: String,
                     response: String,
                     guests: Int,
                     member: MemberDetails,
                     rsvp_id: Long,
                     mtime: Long,
                     event: EventDetails,
                     group: GroupDetails
                   )

如上所示,参数'venue'是VenueDetails类型的可选字段,也是一个案例类。

case class VenueDetails(venue_name: String, lon: Double, lat: Double, venue_id: Int)

当我这样做时:

p.venue.getOrElse(Default=None)

我得到的输出为:

VenueDetails(Waller Creek Pub House,-97.73584,30.266438,24179503)

以上内容以“带可序列化的产品”的形式返回。如何从VenueDetails案例类中分别从此输出中提取地址名称,纬度,经度,场地ID等数据。

2 个答案:

答案 0 :(得分:2)

我将假设pRSVPData项。正确? (

.getOrElse上使用Option时,如果未定义任何值(即值None),则会尝试提供默认值。换句话说,getOrElse使您有机会在没有可用时提供默认场地详细信息,以便您可以以一致的方式处理这两种情况。在您的情况下,此参数应该是VenueDetails的实例。

如果None的值为{{1 - 这没什么意义。更糟糕的是,getOrElse现在返回两种类型的值:NoneOption。因此, Scala 将返回类型确定为这两种类型共有的特征,它们已确定为None。因此,您无法将返回值视为getOrElse,因此您无法访问其成员。

一般经验法则永远不会将VenueDetails传递给None ! ; - )

(顺便说一句,在调用中指定参数名称是不必要的; Product with Serializable更简单,相当于VenueDetails。)

所以,现在它取决于你正在尝试做什么,而你的问题并不清楚。我将尝试提供一些例子......

这第一个例子比功能性更为必要。它试图打印出场地的细节:

None

这是一个功能稍强的版本:

Option.getOrElse

此版本使用默认的VenueDetails实例,以了解场地详情未知的情况:

p.venue.getOrElse(None)

在后一种情况下,如果p.venue为None,则将打印以下内容:

p.venue.getOrElse(default = None)

但是,如果根据您的示例定义了p.venue,则将打印以下内容:

// Is the venue defined? (If None, then it's undefined.)
if (p.venue.isDefined) {

  // Retrieve the defined details. Note that get throws an exception if p.venue is None.
  // BTW, detail's type is inferred to be VenueDetails.
  val details = p.venue.get
  println(s"Venue: ${details.venue_name}, loc: (${details.lon}, ${details.lat}), id: ${details.venue_id}")
}

// Handle the case where the venue details are undefined.
else {
  println("Venue details are unknown")
}

答案 1 :(得分:-1)

我希望这会奏效:

p.venue.map(_.venue_name).getOrElse(None)