第一次发生后中断flatMap

皮特·科佩奇(PiotrKopeć)
abstract class Node(id: Long, name: String) {
  def find(id: Long) = if (this.id == id) Some(this) else None
}
case class Contact(id: Long, name: String, phone: String) extends Node(id, name)
case class Group(id: Long, name: String, entries: Node*) extends Node(id, name) {
  override def find(id: Long): Option[Node] = {
    super.find(id) orElse entries.flatMap(e => e.find(id)).headOption
  }
}
val tree =
  Group(0, "Root"
      , Group(10, "Shop", Contact(11, "Alice", "312"))
      , Group(20, "Workshop"
          , Group(30, "Tyres", Contact(31, "Bob", "315"), Contact(32, "Greg", "319"))
          , Contact(33, "Mary", "302"))
      , Contact(1, "John", "317"))
println(tree.find(32))

树数据是根据ContactGroup(带有子Group和Contacts)构建的我想找到一个具有特定id的节点目前,我使用以下方法遍历Group的成员:

entries.flatMap(e => e.find(id)).headOption

但这不是最佳选择,因为我会检查所有子条目,而不是在首次查找时中断。

感谢您在魔术Scala Wold中的帮助谢谢。

迈克尔·扎亚克(Michael Zajac)

您需要collectFirst,它将选择第一个匹配的元素并将其包装在中Some,或者None如果找不到它。您也可以转为entries视图,以使评估变得懒惰。

entries.view.map(_.find(id)).collectFirst { case Some(node) => node }

它也将与您的原始代码一起使用:

entries.view.flatMap(_.find(id)).headOption

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章