scala - 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中,大多数控制结构都是表达式而不是语句。
因此,if-else
必须返回一个值。由于您没有else
分支,因此编译器会插入 this else ()
。因此,您的代码有时会返回Strings有时会返回Unit并且这两种类型的LUB是Any。
有几种方法可以解决这个问题,一种是确保列表没有nulls
在map
(通常在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))
我会推荐你最后四个,因为不建议null
在Scala中直接操作。除非性能是必须的并且分配Option
对于您的用例来说太昂贵(这种情况很少发生)。
推荐阅读
- angular - 为什么我在 dom 中收到“错误错误:选择器“ng-component”不匹配任何元素”?
- reactjs - 如何解决 React Redux 有效负载未传递给状态对象
- python - 具有全息视图和“散景”的 3d 曲面图
- sql - SQL左连接避免空条目
- javascript - 我可以将数据从html传递到js吗
- mysql - 试图获取一个表中的所有记录,这些记录在另一个表中有数据并总结它们
- python - Python - YouTube API v3 - 如何仅获取热门搜索结果的视频 ID?
- pandas - Groupby操作后如何制作条形图(x轴上有日期)
- angular - 具有状态和目标 _blank 的 Angular Routerlink
- r - Shiny 布局,Shiny 中是否可以有left andride sidebarLayout?