将Iterable隐式转换为Option

时间:2015-02-20 13:41:02

标签: scala

我有一个要求,我想隐式转换和Iterable到Option。要求是如果Iterable为空我返回None否则我返回Some(可迭代)。

以下代码

implicit def toOption[T](iterable: Iterable[T]): Option[Iterable[T]] = if (iterable.isEmpty) None else Some(iterable)
val opt = List(6,7,8).toOption

我收到编译错误'值toOption不是其成员  列表[INT]'

我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

如果你想这样做,单独的隐式转换对你没有帮助。您需要的是implicit class :

object Rich {
   implicit class RichIterable[T](it: Iterable[T]){
     def toOption: Option[Iterable[T]] = if(it.isEmpty) None else Some(it)
   }
}

scala> import Rich._  
import Rich._

scala> List(1,2,3).toOption  
res0: Option[Iterable[Int]] = Some(List(1, 2, 3))

scala> List().toOption  
res1: Option[Iterable[Nothing]] = None

答案 1 :(得分:2)

你的调用语法是错误的(t​​oOption不是这种方式的列表方法,它是顶级方法/函数),你需要在类型中不那么具体(所以它可以用于隐式转换等):

  implicit def toOption[I <% Iterable[_]](iterable: I): Option[I] = if (iterable.isEmpty) None else Some(iterable)
  val opt1: Option[List[Int]] = List(6,7,8)
  val opt2: Option[List[Int]] = List()

这里我使用了一个视图(&lt;%),这意味着只要参数可以被强制转换或转换为Iterable type,就可以了。

你也可以这样编写作业:

val opt2 = List(): Option[List[Int]]

这里有一些关于观点的文档:

http://docs.scala-lang.org/tutorials/tour/views.html