看到像这样一个涉及恐怖的问题的答案显示就像试图抓住NPE并从堆栈轨迹中挖掘出受损的名称,我问这个问题所以我可以回答它.
欢迎评论或进一步改进.
在斯卡拉,如果我有
hub = myBicycle.getFrontWheel.getHub()
Run Code Online (Sandbox Code Playgroud)
并且可能前轮缺失,即myBicycle.getFrontWheel() == null,我只想在这种情况下hub被分配null,表达这种情况最简洁的方式是什么?
我现在不得不这样做
hub = if (myBicycle.getFrontWheel() == null) null else myBicycle.getFrontWheel.getHub()
Run Code Online (Sandbox Code Playgroud)
当访问者链更长时,它会变得更糟.
不熟悉Scala宏,我想知道是否有可能编写一个Scala宏以某种方式捕获方法名称并仅在对象引用为非null时才应用它?
假设我有来自查询字符串请求参数的String参数.如您所知,参数可能丢失或可能存在,但值为空字符串.在groovy语言中,我可以简单地做一些事情
List lst = words?.split(',')
Run Code Online (Sandbox Code Playgroud)
如果单词为null,则lst将为null而不是抛出NPE
scala中的类似快捷方式是什么?
Option [String]在这里不是一个选项,因为它是来自查询字符串的单词是String类型.
我无疑是Scala的新手,我在许多Scala示例中遇到的语法糖问题.它通常会产生一个非常简洁的陈述,但老实说到目前为止(对我而言)有点难以理解.
因此,我希望将Option类(安全解除引用)的典型用法作为开始理解的好地方,例如,在我看到的特定示例中使用下划线.
我发现了一篇非常好的文章,展示了使用Option来避免null的情况.
https://medium.com/@sinisalouc/demystifying-the-monad-in-scala-cc716bb6f534#.fhrljf7nl
他描述了一个用途:
trait User {
val child: Option[User]
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您也可以将这些函数编写为就地lambda函数,而不是先验地定义它们.然后代码变为:
val result = UserService.loadUser("mike")
.flatMap(user => user.child)
.flatMap(user => user.child)
Run Code Online (Sandbox Code Playgroud)
那看起来很棒!也许不像人们在groovy中那样简洁,但也不错.
所以我想我会尝试将它应用到我想要解决的案例中.
我有一种类型Person,其中a的存在Person是可选的,但如果我们有一个人,他的属性是有保证的.出于这个原因,没有使用的Option的内型Person类型本身.
的Person具有PID它的类型的Id.该Id类型包括两种String类型; Id-Type和Id-Value.
我使用Scala控制台测试以下内容:
class Id(val idCode : String, val idVal : String)
class Person(val pid : Id, val name : String)
val anId: Id = new Id("Passport_number", "12345")
val person: Person = new Person(anId, "Sean")
val operson : …Run Code Online (Sandbox Code Playgroud)