搜索json键,如果其值为空字符串,则返回空列表

时间:2019-06-24 07:35:50

标签: scala

此代码不能很好地处理空字符串值:

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

2 个答案:

答案 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))