鉴于
val optionalList: Option[List[Int]] = Some(List(1,2,3))
我目前使用类似
的内容映射元素optionalList.map(_.map(_ * 2))
我不特别喜欢map(_.map(
语法。是否有更好的方法,如optionalList.mapValues(_ * 2)
或类似的东西?我想过写一个隐含的对象来处理这个问题但是scala已经有了一些我不知道的事情
答案 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)