如何选择从map函数返回值

时间:2015-11-25 21:56:24

标签: scala

集合上的

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}

4 个答案:

答案 0 :(得分:8)

如果您要返回Option,则flatMap可以None,并且只获取存在的值(即不是(1 to 10).flatMap { x => val res: Option[Int] = service.getById(x) res.map{y => Pair(x, y) } } )。

map

根据您的建议,合并filtercollect的另一种方法是使用(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