如何根据条件在列表中查找元素,并在Scala中返回与该元素关联的一些数据

时间:2015-12-12 21:47:23

标签: scala

我在Scala中思考时遇到了一些困难,我不断回到命令式的思维模式。我可以使用什么Scala模式以Scala方式实现以下粗略伪代码:

for (item in list)
{
  val result = some_func(item) // result is a pair (Boolean, some data)
  if (result._1)
    return result
}
return (false, null)

谢谢

2 个答案:

答案 0 :(得分:3)

您可以使用map来应用该功能,然后使用find来查找_1 == true的映射值,该值为Option,然后使用{{1}返回默认值。

getOrElse

缺点是def perform[A, B](list: List[A])(fun: A => (Boolean, B)): (Boolean, B) = list.map(fun).find(_._1).getOrElse((false, null.asInstanceOf[B])) 会将map应用于所有元素,而您更希望中止fun的第一个元素:

_1 == true
val xs = List(1, 2, 3, 4)

perform(xs) { x =>
  println(s"Testing $x")
  (x % 2 == 0, x / 2)
}

一种可能性是使用迭代器:

Testing 1
Testing 2
Testing 3
Testing 4
res0: (Boolean, Int) = (true,1)
def perform[A, B](list: List[A])(fun: A => (Boolean, B)): (Boolean, B) =
  list.iterator.map(fun).find(_._1).getOrElse((false, null.asInstanceOf[B]))

此外,请考虑返回Testing 1 Testing 2 res1: (Boolean, Int) = (true,1) 而不是Option[B],这样可以避免(Boolean, B)的丑陋,并且在返回方面更安全:

null

关于迭代器与视图:

我发现只要它们提供所需的方法,就可以更容易地跟踪迭代器。我还认为视图机制将在未来的集合中重新设计。

答案 1 :(得分:0)

基于这篇文章:Finding elements in a scala list and also know which predicate has been satisfied我想出了这个:

list.view.map(el => (el, some_func(el))).find(t => t._2._1)