2014-01-31 61 views
1

給定一個列表,根據列表的空白性返回一個值的最佳方法是什麼?根據列表空值返回不同值的最佳方法

使用匹配?

xs match { 
    case Nil => a 
    case _ => b 
} 

還是一個if語句?

if (xs.isEmpty) a else b 

似乎模式匹配在這種情況下觸發了很多樣板。這種情況是否有一種習慣解決方案?

+1

常見的反模式我厭倦了看到的是'標誌匹配{情況屬實=> ??? ; case false => ??? }':-( –

回答

4

「偏愛」是主觀的,但簡單if有幾個優點:

  • 似乎有不被需要使用模式在這種情況下匹配,因爲你不真正利用其功能(例如不提取)。

  • 第二種方法明確告訴您檢查列表是否爲空,因此可以立即讀取。

總結:圖案斯卡拉匹配是一個強大的工具,因爲它的力量就增加了複雜到您的代碼,無論是在機器和人類可讀性方面。換句話說:並非所有東西都是釘子;)。

1

當您需要遞歸或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 => // .. 
} 
0

我不會說這是更好,但更好的方法是:

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'