首页 > 解决方案 > scala:为什么代码返回 List [Any] 而不是 List [String]?

问题描述

我正在尝试学习 scala,但让我感到困惑的是:

为什么以下代码返回List[Any]而不是List[String]

def listToLowerCase(l: List[String]) = l.map(s=>if(s != null) s.toLowerCase) 

是因为当字符串是null我什至没有调用lowerCase函数吗?但它不应该什么都不返回吗?

标签: scala

解决方案


Scala中,大多数控制结构都是表达式而不是语句
因此,if-else必须返回一个值。由于您没有else分支,因此编译器会插入 this else ()。因此,您的代码有时会返回Strings有时会返回Unit并且这两种类型的LUBAny

有几种方法可以解决这个问题,一种是确保列表没有nullsmap (通常在Scala中我们从不期望 a null)之前。null其他是例如当字符串为空字符串时返回一些默认值。另一种是使用Option数据类型来表示缺失值。

以下是一些建议:

list.filter(_ != null).map(_.toLowerCase)
list.collect { case str if (str != null) => str.toLowerCase }
list.map(str => if (str != null) str.toLowerCase else "")
list.map(str => Option(str).map(_.toLowerCase))
list.map(str => Option(str).map(_.toLowerCase)).getOrElse("")
list.map(str => Option(str).fold(ifEmpty = "")(_.toLowerCase))
list.flatMap(str => Option(str).map(_.toLowerCase))

我会推荐你​​最后四个,因为不建议nullScala中直接操作。除非性能是必须的并且分配Option对于您的用例来说太昂贵(这种情况很少发生)


推荐阅读