2014-05-08 58 views

回答

6
optionIterator find { case Some(x) if predicate(x) => true case _ => false } 

至于无视例外...它是谓语,可以throw ?因为这不是很明智。尽管如此...

optionIterator find { 
    case Some(x) => Try(predicate(x)) getOrElse false 
    case _  => false 
} 
+0

或'尝试(P(X))getOrElse返回FALSE。 –

+0

是的,那样更好。我已经更新了答案以反映它。 –

1

假设你可以用你的断言,这样的错误返回false:

iterator.flatMap(x => x).find(yourSafePredicate) 

flatMap需要集合的集合(其中Option可迭代是作为OptionEither被认为是与一个的最大大小的集合),并将其转换成一个单一的集合:

scala> for { x <- 1 to 3; y <- 1 to x } yield x :: y :: Nil 
res30: IndexedSeq[List[Int]] = Vector(List(1, 1), List(2, 1), List(2, 2), List(3, 1), List(3, 2), List(3, 3)) 

scala> res30.flatMap(x => x) 
res31: IndexedSeq[Int] = Vector(1, 1, 2, 1, 2, 2, 3, 1, 3, 2, 3, 3) 

find返回的迭代,一个谓语为OptionNone匹配的第一个条目;如果没有匹配:

scala> (1 to 10).find(_ > 3) 
res0: Option[Int] = Some(4) 

scala> (1 to 10).find(_ == 11) 
res1: Option[Int] = None 
3

添加的最佳地道一件大衣的油漆工作:

scala> val vs = (0 to 10) map { case 3 => None case i => Some(i) } 
vs: scala.collection.immutable.IndexedSeq[Option[Int]] = Vector(Some(0), Some(1), Some(2), None, Some(4), Some(5), Some(6), Some(7), Some(8), Some(9), Some(10)) 

scala> def p(i: Int) = if (i % 2 == 0) i > 5 else ??? 
p: (i: Int)Boolean 

scala> import util._ 
import util._ 

scala> val it = vs.iterator 
it: Iterator[Option[Int]] = non-empty iterator 

scala> it collectFirst { case Some(i) if Try(p(i)) getOrElse false => i } 
res2: Option[Int] = Some(6) 

获得过五第一偶数不炸掉测试。

1

一些样本数据

scala> val l = Seq(Some(1),None,Some(-7),Some(8)) 
l: Seq[Option[Int]] = List(Some(1), None, Some(-7), Some(8)) 

使用上的选项的序列flatMap会产生一个序列定义值,所有的无的都将被丢弃

scala> l.flatMap(a => a) 
res0: Seq[Int] = List(1, -7, 8) 

然后用发现 - 您将获得满足谓词的第一个值。请注意,发现的值被封装为选项,导致找到应该能够在“未找到”情况下返回有效值(无)值。

scala> l.flatMap(a => a).find(_ < 0) 
res1: Option[Int] = Some(-7) 

据我所知,这是“好”的方式为斯卡拉。

可能更习惯用法是使用收集/collectFirst在Seq ...

scala> l.collectFirst { case [email protected](x) if x < 0 => a } 
res2: Option[Some[Int]] = Some(Some(-7)) 

注重的是,这里我们有一些(部分(-7)),因为collectFind应该有机会产生“未找到”的值,所以在这里第1部分 - 从collectFirst,第二部分 - 从Option的Seq的源元素。

你可以拉平一些(一些(-7))如果你需要在你的手中的价值。

scala> l.collectFirst({ case [email protected](x) if x < 0 => a }).flatten 
res3: Option[Int] = Some(-7) 

如果没有找到 - 你将拥有无

scala> l.collectFirst({ case [email protected](x) if x < -10 => a }).flatten 
res9: Option[Int] = None 
+0

问题是关于迭代器的。 –