2017-10-16 70 views
-1
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 
        ) 

如上所示,参数“场地”是类型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等。

回答

-1

我希望这会工作:

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

我要去假设pRSVPData项目。正确? (

当你在一个Option使用.getOrElse,你正试图提供在没有定义值(即,当值None)。换句话说时的默认值,getOrElse给你一个机会提供默认的详细地点时没有可用的,这样就可以以一致的方式处理这两种情况。在你的情况,这种说法应该是VenueDetails一个实例。

通过传递None作为参数getOrElse你说如果Option的值为None,那么你想要None--这意义不大,更糟糕的是,getOrElse现在返回两种类型的值:a VenueDetailsNone。因此,斯卡拉确定返回类型为这两种类型共有的特征,它们确定为Product with Serializable。因此,您不能将返回值视为VenueDetails,因此您无法访问其成员。

一般拇指的规则:从来没有过NoneOption.getOrElse! ;-)

(顺便说一句,在调用中指定的参数名是不必要的。p.venue.getOrElse(None)是简单等同于p.venue.getOrElse(default = None)

所以,现在它取决于你想要做什么,这不清楚你的问题。我会尝试提供几个例子...

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

// 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") 
} 

这里有一个稍微功能版本:

val desc = p.venue.fold { 

    // This argument is evaluated only if p.venue is None. 
    "Venue details are unknown" 
} { 

    // This argument is executed only if p.venue is defined (not None). 
    // Again, details is inferred to have type VenueDetails 
    details => 
    s"Venue: ${details.venue_name}, loc: (${details.lon}, ${details.lat}), id: ${details.venue_id}" 
} 
println(desc) 

这个版本使用了其中的详细地点是未知的情况下,默认VenueDetails实例:

// Default details for case where p.venue is None. 
val defaultDetails = VenueDetails("Unknown", 0.0, 0.0, -1) 

// Here, details will have type VenueDetails. 
val details = p.venue.getOrElse(defaultDetails) 
val desc = s"Venue: ${details.venue_name}, loc: (${details.lon}, ${details.lat}), id: ${details.venue_id}" 
println(desc) 

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

Venue: Unknown, loc: (0.0, 0.0), id: -1 

然而,如果p.venue被定义为每您的例子,则以下将被打印:

Venue: Waller Creek Pub House, loc: (-97.73584, 30.266438), id: 24179503