2014-11-20 46 views
-4

哪一個在實踐中更好?有一個可選列表或在列表中有可選項目?可選項列表/數組

目前我正在關注一個可選列表。

List [Option [T]]或Option [List [T]]?

編輯:

我遇到的問題是,我有我從返回可選類型的CRUD操作。我有一種情況,我有一個方法,做一個單一的查找,我想利用它來使一個函數返回一個列表。我仍然用scala弄溼了自己的腳,所以我很好奇最佳做法是什麼。

例子:

def findOne(id: Int): Option[T] 

不管執行的我想用它的東西喜歡這些,但哪個更好?他們似乎都是奇怪的映射。也許有我丟失的東西放在一起:

def find(ids: List[Int]) : Option[List[T]] 

VS

def find(ids: List[Int]) : List[Option[T]] 
+4

更好的什麼?這就像問哪個更好,整數或字符串? – lmm 2014-11-20 19:02:07

+0

哪個更符合邏輯?哪種類型更準確地描述'find'的結果?使用更精確地模擬數據的類型,而不是更容易處理的類型。 – drstevens 2014-11-20 19:42:17

+0

'Optional'是一個Java 8類型。 'Option'是Scala中的類型名稱。 – DaoWen 2014-11-20 20:46:52

回答

1

如果您想要檢索可能存在的幾件事情,並且它們中的一些存在並且其中一些不存在,那麼它是List[Option[T]]-幾個條目的列表,其中每個條目都存在或不存在。這是有意義的,例如,一個「搜索」的情況,你想顯示哪一個存在,可能只有一些要求的東西。

def find(ids: List[Int]) = ids map findOne 

如果您使用Option表示類似的「錯誤」的情況下,你想「如果其中任何失敗,那麼整個事情是一個失敗」,則:您可以爲實現該方法你想要Option[List[T]] - 要麼是完整的列表,要麼完全沒有。您可以使用Scalaz實現該功能,如下所示:

def find(ids: List[Int]) = ids traverse findOne 
+0

謝謝。這有助於我必須檢查scalaz – rfrittelli 2014-11-21 15:50:43

6

這兩種類型的意思是完全不同的東西。 List[Option[T]]看起來像一箇中間結果,你會flatten。 (在這種情況下,我會考慮使用flatMap)。

第二種類型,Option[List[T]]表示可能有或沒有列表。當您需要區分「無結果」和「結果是空列表」時,這將是一種很好的類型。

我想不出兩種類型都有意義的情況。

1

道文已經開始考慮您的問題了。 List[Option[T]]甚至不會編碼比List[T]更多的信息,而沒有暗示您的id列表與結果列表的順序相同。

我actualy青睞

def find(ids: Seq[Int]): Seq[T] 

def find(ids: Seq[Int]): Option[NonEmptyList[T]] 

其中NonEmptyList是一種類型的序列實際上被強制不是空的,例如在Scalaz。除非你真的想指出None和一些空列表之間的區別。

順便說一句,你可能會想使用更普遍Seq[T]您接口而不是List[T]