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 次 |
最近记录: |