給定一個列表,根據列表的空白性返回一個值的最佳方法是什麼?根據列表空值返回不同值的最佳方法
使用匹配?
xs match {
case Nil => a
case _ => b
}
還是一個if語句?
if (xs.isEmpty) a else b
似乎模式匹配在這種情況下觸發了很多樣板。這種情況是否有一種習慣解決方案?
給定一個列表,根據列表的空白性返回一個值的最佳方法是什麼?根據列表空值返回不同值的最佳方法
使用匹配?
xs match {
case Nil => a
case _ => b
}
還是一個if語句?
if (xs.isEmpty) a else b
似乎模式匹配在這種情況下觸發了很多樣板。這種情況是否有一種習慣解決方案?
「偏愛」是主觀的,但簡單if
有幾個優點:
似乎有不被需要使用模式在這種情況下匹配,因爲你不真正利用其功能(例如不提取)。
第二種方法明確告訴您檢查列表是否爲空,因此可以立即讀取。
總結:圖案斯卡拉匹配是一個強大的工具,因爲它的力量就增加了複雜到您的代碼,無論是在機器和人類可讀性方面。換句話說:並非所有東西都是釘子;)。
當您需要遞歸或head :: tail
時,模式匹配語法是首選。 List
在Scala是由舊的ML語言(Cons(head, tail)
)的啓發,你會得到一個不錯的head :: tail
對匹配:
someList match {
case head :: tail => // this will actually be someList.head and someList.tail
case Nil => // ..
}
我不會說這是更好,但更好的方法是:
xs.headOption.fold(a)(_ => b)
在這種情況下,它看起來有點奇怪,因爲你忽略了head元素,而是返回b
,但是如果你真的想用它作爲返回值,以下是非常優雅的:
xs.headOption.getOrElse(a) //will return the head element or a if none
我最喜歡的會加入一些scalaz
:
import scalaz._
import Scalaz._
xs.headOption ? b | a // if defined 'b' else 'a'
常見的反模式我厭倦了看到的是'標誌匹配{情況屬實=> ??? ; case false => ??? }':-( –