Scala 在Set.fold中将null用作值会生成NoTouchElement异常
在我的Scala 在Set.fold中将null用作值会生成NoTouchElement异常,scala,Scala,在我的Scala代码中,我从集合的元素生成字符串,然后存储在Cassandra中。我注意到,如果我使用null作为累加器的初始值,那么当我获取该记录时,我会得到错误java.util.NoSuchElementException:No value present。但是如果我使用“,那么我就不会使用 这样行 Tuple3(tagsToStore.tagsOfInterest.fold("")((a:String,b:String)=>{if(a != "&quo
Scala
代码中,我从集合的元素生成字符串
,然后存储在Cassandra
中。我注意到,如果我使用null
作为累加器的初始值,那么当我获取该记录时,我会得到错误java.util.NoSuchElementException:No value present
。但是如果我使用“
,那么我就不会使用
这样行
Tuple3(tagsToStore.tagsOfInterest.fold("")((a:String,b:String)=>{if(a != "") a+";"+b else b}),
tagsToStore.questionCreatedTag.fold("")((a:String,b:String)=>{if(a != "") a+";"+b else b}),
tagsToStore.questionAnsweredTag.fold("")((a:String,b:String)=>{if(a != "") a+";"+b else b}))
} else Tuple3("","","") //I thought to use null instead of "" but that gave me error when fetching the profile Reason java.util.NoSuchElementException: No value present
这并不重要
Tuple3(tagsToStore.tagsOfInterest.fold(null)((a:String,b:String)=>{if(a != "") a+";"+b else b}),
tagsToStore.questionCreatedTag.fold(null)((a:String,b:String)=>{if(a != "") a+";"+b else b}),
tagsToStore.questionAnsweredTag.fold()((a:String,b:String)=>{if(a != "") a+";"+b else b}))
} else Tuple3(null,null,null) //I thought to use null instead of "" but that gave me error when fetching the profile Reason java.util.NoSuchElementException: No value present
数据模型是
case class ...(tagsOfInterest:Set[String],
questionCreatedTag:Set[String],
questionAnsweredTag:Set[String]
)
为什么使用null
会引发异常?如果没有Scala和JVM版本信息以及堆栈跟踪,就无法给出NoTouchElementException
的确切原因(在Scala 2.13和最近的OpenJDK8上,我无法重现这个问题:null
当作为字符串处理时
被强制为“null”
)
然而,一般来说,除了与其他语言编写的库直接交互的代码部分之外,在惯用的Scala代码中通常不会遇到null
。这反过来意味着null
不会被视为在标准库中的许多函数的域中,因此可能会发生奇怪的事情
您想要的行为可以用更惯用的方式表达:
(tagsToStore.tagsOfInterest.mkString(";"),
tagsToStore.questionCreatedTag.mkString(";"),
tagsToStore.questionAnsweredTag.mkString(";"))
旁注:构造TupleN
的惯用方法是(x,y,z)
,而不是Tuple3(x,y,z)
(后者是编译器对前者的扩展)。问题是什么?