2014-11-20 57 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]