map
函数需要为每次迭代返回一些值。但是我试图找到一种不是为每次迭代返回值的方法,而只是为了匹配某些谓词的初始值。
我想要的东西是这样的:
(1 to 10).map { x =>
val res: Option[Int] = service.getById(x)
if (res.isDefined) Pair(x, res.get )// no else part
}
我认为像.collect
函数这样的东西可以做到,但似乎collect
函数我需要在guards blocks中编写很多代码(case x if {...// too much code here}
)
答案 0 :(得分:8)
如果您要返回Option
,则flatMap
可以None
,并且只获取存在的值(即不是(1 to 10).flatMap { x =>
val res: Option[Int] = service.getById(x)
res.map{y => Pair(x, y) }
}
)。
map
根据您的建议,合并filter
和collect
的另一种方法是使用(1 to 10).collect{ case x if x > 5 => x*2 }
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(12, 14, 16, 18, 20)
和部分应用的功能。这是一个简化的例子:
roll_no
答案 1 :(得分:3)
您可以使用收集功能(see here)完全按照您的意愿执行操作。您的示例将如下所示:
(1 to 10) map (x => (x, service.getById(x))) collect {
case (x, Some(res)) => Pair(x, res)
}
答案 2 :(得分:2)
使用for comprehension,像这样,
for ( x <- 1 to 10; res <- service.getById(x) ) yield Pair(x, res.get)
这会产生res
未评估为None
的对。
答案 3 :(得分:0)
获得第一个元素:
(1 to 10).flatMap { x =>
val res: Option[Int] = service.getById(x)
res.map{y => Pair(x, y) }
}.head