首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据条件在列表中查找元素,并在Scala中返回与该元素关联的数据

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

Stack Overflow用户
提问于 2015-12-12 21:47:22
回答 2查看 82关注 0票数 1

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

代码语言:javascript
复制
for (item in list)
{
  val result = some_func(item) // result is a pair (Boolean, some data)
  if (result._1)
    return result
}
return (false, null)

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-12 21:58:56

您可以使用map应用函数,然后使用find查找映射值,其中_1 == true给出Option,然后使用getOrElse返回默认值。

代码语言:javascript
复制
def perform[A, B](list: List[A])(fun: A => (Boolean, B)): (Boolean, B) =
  list.map(fun).find(_._1).getOrElse((false, null.asInstanceOf[B]))

缺点是mapfun应用于所有元素,而您更愿意在第一个_1 == true元素上中止

代码语言:javascript
复制
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)

一种可能是使用迭代器:

代码语言:javascript
复制
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的丑陋,在返回端处理更安全:

代码语言:javascript
复制
def perform[A, B](list: List[A])(fun: A => (Boolean, B)): Option[B] =
  list.iterator.map(fun).collectFirst { case (true, res) => res }

关于迭代器和视图:

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

票数 3
EN

Stack Overflow用户

发布于 2015-12-12 22:01:39

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

代码语言:javascript
复制
list.view.map(el => (el, some_func(el))).find(t => t._2._1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34245378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档