sta*_*010 5 scala apache-spark
我已经明白,我可以轻松地使用List.sum以下列表:
var mylist = List(1,2,3,4,5)
mylist.sum
// res387: Int = 15
Run Code Online (Sandbox Code Playgroud)
但是,我有一个包含None和的元素的列表Some(1).这些值是在运行左外连接后生成的.
现在,当我尝试运行时List.sum,我收到一个错误:
var mylist= List(Some(0), None, Some(0), Some(0), Some(1))
mylist.sum
<console>:27: error: could not find implicit value for parameter num: Numeric[Option[Int]]
mylist.sum
^
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我可以以某种方式将None和Some值转换为整数,也许就在左外连接之后?
您可以使用List.collect模式匹配方法:
mylist.collect{ case Some(x) => x }.sum
// res9: Int = 1
Run Code Online (Sandbox Code Playgroud)
这忽略了None元素.
另一种选择是使用getOrElse在Option提取值,在这里你可以选择你要替换什么价值None有:
mylist.map(_.getOrElse(0)).sum
// res10: Int = 1
Run Code Online (Sandbox Code Playgroud)
我发现处理集合的最简单方法Option[A]是flatten:
val myList = List(Some(0), None, Some(0), Some(0), Some(1))
myList.flatten.sum
Run Code Online (Sandbox Code Playgroud)
调用flatten将删除所有None值并将剩余的值Some[Int]变为普通旧 - Int最后留给你一个集合Int.
顺便说一句,拥抱不变性是Scala一流的公民,更喜欢val到var.
| 归档时间: |
|
| 查看次数: |
1110 次 |
| 最近记录: |