我在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)谢谢
发布于 2015-12-12 21:58:56
您可以使用map应用函数,然后使用find查找映射值,其中_1 == true给出Option,然后使用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)
}测试1测试2测试3测试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]))测试1测试2 res1:(Boolean,Int) = (true,1)
另外,考虑返回一个Option[B]而不是(Boolean, B),这样可以避免null的丑陋,在返回端处理更安全:
def perform[A, B](list: List[A])(fun: A => (Boolean, B)): Option[B] =
list.iterator.map(fun).collectFirst { case (true, res) => res }关于迭代器和视图:
我发现,只要迭代器提供所需的方法,就可以更容易地跟踪它们。我还认为视图机制将在未来的集合中重新设计。
发布于 2015-12-12 22:01:39
基于这篇文章: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)https://stackoverflow.com/questions/34245378
复制相似问题