我在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)
谢谢
答案 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)