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)
(后者是编译器对前者的扩展)。

问题是什么?