此代码不能很好地处理空字符串值:
val getPerson = (json \ "ID").asOpt[String].map(id => List(Person(name, id, birthday))).getOrElse(List.empty)
问题是ID可以是一个空字符串,Person的构造函数允许id为空(根据设计),但是我不希望现阶段没有ID的Persons。
我尝试过:
val getPerson = (json \ "ID").asOpt[String].map(id => if (id.nonEmpty) List(Person(name, id, birthday))).getOrElse(List.empty)
但是返回类型是Any
而不是List[Person]
我的目标是在id
为空的情况下返回List.empty
答案 0 :(得分:2)
除了@pme答案外,您应使用List.empty[Type]
(无论是String
还是Person
而不是List.empty
的原因是因为List.empty
是实际上是List[Nothing]
类型的。
因为在一种情况下返回了List[Person]
,在另一种情况下返回了List[Nothing]
,所以返回类型为Any
。
无论如何,当您处理空集合(Seq,List等)时,您应该始终喜欢List/Seq.empty[Type]
,因为它可以更清楚地表达您的意图,并且不需要实例化(空)重复参数实参列表。
答案 1 :(得分:1)
只需将类型添加到List.empty
,例如:
scala> List.empty[String]
res0: List[String] = List()
在您的示例中,filter
可能是一个更好的解决方案:
val person = (json \ "ID")
.asOpt[String]
.filter(_.nonEmpty)
.toList
.map(Person(name, _, birthday))