2009-09-01 53 views
20

看到像this one这样的问题出现的答案涉及恐怖表演,比如试图抓住NPE并将堆叠的名字从堆栈轨迹中挖出来,我问这个问题以便我可以回答它。如何在scala中编写一个合适的null-safe合并运算符?

评论或进一步改进欢迎。

+3

你应该已经回答了这个问题,而不是创建一个新的。或者,除了。 – 2009-09-01 23:59:37

+3

如果你这么说。当我回答一个问题超过约24小时后,问题的答案在默默无闻,无论其相对优点(并考虑到我只回答斯卡拉问题,我有一些想法我的答案的价值。) – extempore 2009-09-03 02:28:02

+0

谢谢,这是恐怖的看到涉及例外的解决方案。除非你想减慢你的应用几个数量级。 – smartnut007 2012-08-07 03:48:28

回答

33

像这样:

case class ?:[T](x: T) { 
    def apply(): T = x 
    def apply[U >: Null](f: T => U): ?:[U] = 
    if (x == null) ?:[U](null) 
    else ?:[U](f(x)) 
} 

而且在行动:

scala> val x = ?:("hel")(_ + "lo ")(_ * 2)(_ + "world")() 
x: java.lang.String = hello hello world 

scala> val x = ?:("hel")(_ + "lo ")(_ => (null: String))(_ + "world")() 
x: java.lang.String = null 
+0

这是真的很酷 – jpswain 2016-08-30 07:01:10

+8

我已经等了七年,有人做这个观察!谢谢。 – extempore 2016-08-30 20:34:00