如何映射可选集合

时间:2016-03-18 22:45:32

标签: scala

鉴于

val optionalList: Option[List[Int]] = Some(List(1,2,3))

我目前使用类似

的内容映射元素
optionalList.map(_.map(_ * 2))

我不特别喜欢map(_.map(语法。是否有更好的方法,如optionalList.mapValues(_ * 2)或类似的东西?我想过写一个隐含的对象来处理这个问题但是scala已经有了一些我不知道的事情

4 个答案:

答案 0 :(得分:0)

这就是我想出来的......

implicit class OptionalSeq[I, O](input: Option[Seq[I]]) {
    def mapContents(f: (I) => O): Option[Seq[O]] = {
        input.map(_.map(f))
    }
}
...
val optionalList: Option[Seq[Int]] = Some(Seq(1,2,3))
val doubled: Option[Seq[Int]] = optionalList.mapContents(_ * 2)

答案 1 :(得分:0)

如果你想要更明确一点def __str__(self): return "{} {} {}\n".format(self.name, self.phone, self.email) 这就是我的意思。

optionalList.map(_.map(_ * 2))

另一种“解决”问题的方法是使用空val doubled = optionalList match { case Some(list) => Some(list.map(_ * 2)) case None => None } 代替List。只有在您的问题域中有意义时才会有效。

None

答案 2 :(得分:0)

您可以使用monad transformers,例如scalaz import scalaz._ import Scalaz._ import ListT._ val optionalList: Option[List[Int]] = Some(List(1,2,3)) val doubled = listT(optionalList).map(_ * 2).run

{{1}}

但最后,正如Jean-Philippe建议的那样,对于一个如此简单的案例,我会坚持使用经典地图(_。map(每个scala程序员都知道它的含义一目了然)

答案 3 :(得分:0)

你并不清楚你不喜欢map(_.map(_ * 2))的哪一部分。如果是视觉方面,您可以考虑for (list <- optionalList) yield list.map(_ * 2)

之类的内容