在到达第一个None时如何停止构建Option [Collection]?

本·科维兹(Ben Kovitz)

在中建立集合时Option,每次尝试使集合的下一个成员成为可能会失败,从而使整个集合也失败。第一次未能成为会员时,我想立即放弃并返回None整个收藏集。在Scala中,这是一种惯用的方式吗?

这是我想出的一种方法:

def findPartByName(name: String): Option[Part] = . . .

def allParts(names: Seq[String]): Option[Seq[Part]] =
  names.foldLeft(Some(Seq.empty): Option[Seq[Part]]) {
    (result, name) => result match {
      case Some(parts) =>
        findPartByName(name) flatMap { part => Some(parts :+ part) }
      case None => None
    }
  }

换句话说,如果有任何对findPartByNamereturn的调用None,则allPartsreturn None否则,allParts返回一个Some包含的集合的Parts,所有这些保证都有效。空集合是可以的。

上面的优点是它findPartByName在第一次失败后就停止了调用但是foldLeft无论如何仍然为每个名称重复一次。

这是一个会在findPartByName返回a时立即退出的版本None

def allParts2(names: Seq[String]): Option[Seq[Part]] = Some(
  for (name <- names) yield findPartByName(name) match {
    case Some(part) => part
    case None => return None
  }
)

我目前发现第二个版本更具可读性,但是(a)随着我对Scala的了解越来越多,似乎最易读的内容可能会发生变化;(b)我觉得returnScala早已不受欢迎,并且(c)没有一个版本似乎让发生的事情对我尤为明显。

“要么全有要么全无”和“放弃第一个失败”的组合看起来像是一个基本的编程概念,我认为必须有一个通用的Scala或函数用语来表达它。

有翼的潜艇

return你的代码实际上是深藏在匿名函数一对夫妇的水平。结果,必须通过抛出外部函数中捕获的异常来实现它。这不是有效的或漂亮的,因此皱着眉头。

用一个while循环和一个来编写它是最简单,最有效Iterator

def allParts3(names: Seq[String]): Option[Seq[Part]] = {
  val iterator = names.iterator
  var accum = List.empty[Part]
  while (iterator.hasNext) {
    findPartByName(iterator.next) match {
      case Some(part) => accum +:= part
      case None => return None
    }
  }
  Some(accum.reverse)
}

因为我们不知道是什么类型,Seq names所以我们必须创建一个迭代器来高效地对其进行循环,而不是使用tail或索引。while循环可以用尾递归内部函数代替,但是使用迭代器,while循环更清晰。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在到达第一个None时如何停止构建Option [Collection]?

来自分类Dev

如何制作动画情节以在到达最后一个动画步骤时停止回滚?

来自分类Dev

从scala.collection.immutable.Iterable [String]中删除第一个和最后一个Element

来自分类Dev

在Neo4j中到达第一个所需的节点时,停止遍历

来自分类Dev

collection_select不会在集合成员上调用第一个value_method

来自分类Dev

collection_select不会在集合成员上调用第一个value_method

来自分类Dev

在到达字符串中的第一个p标签之前删除所有li标签

来自分类Dev

Mongo db Collection查找从第一个条目返回的结果,而不是从客户端的最后一个条目返回的结果

来自分类Dev

如何克隆Collection <T>?

来自分类Dev

Rails 3.2.12以依赖于第一个collection_select的选择的形式选择第二个元素

来自分类Dev

tensorflow:当张量的第一个暗度为None时,如何外积?

来自分类Dev

新的信号在执行过程中在信号处理程序中到达时,如何确定哪个是第一个?

来自分类Dev

每当找到类中的第一个匹配项时,如何停止方法.contains()?

来自分类Dev

如何停止对第一个错误的验证?

来自分类Dev

Net Stop,在第一个服务正在“停止...”时如何停止第二个服务

来自分类Dev

DirectCast将一个派生的Collection转换为基本Collection

来自分类Dev

Doctrine2 /将Collection元素转移到另一个Collection

来自分类Dev

张量流中第一个轴形状的构建条件图为“ None”

来自分类Dev

jQuery Loop:当到达幻灯片中的最后一个元素时,返回第一个元素?

来自分类Dev

将一个记录限制为Cypher COLLECTION

来自分类Dev

一个Collection侦听BackBone中多个模型的更改

来自分类Dev

从FreeBSD的Ports Collection中仅下载一个端口

来自分类Dev

Collection.insert 不是一个函数 - Meteor

来自分类Dev

smali 记录一个 util/collection ArrayList

来自分类Dev

两个输入中的第一个结束时如何停止FFMPEG处理?

来自分类Dev

当通过反射调用它时,返回Collection的方法将返回一个数组?

来自分类Dev

当多个线程访问同一个Collection时发生ConcurrentModificationException

来自分类Dev

Rails 4:如何通过AJAX基于另一个collection_select更新一个collection_select?

来自分类Dev

Rails 4:如何通过AJAX基于另一个collection_select更新一个collection_select?

Related 相关文章

  1. 1

    在到达第一个None时如何停止构建Option [Collection]?

  2. 2

    如何制作动画情节以在到达最后一个动画步骤时停止回滚?

  3. 3

    从scala.collection.immutable.Iterable [String]中删除第一个和最后一个Element

  4. 4

    在Neo4j中到达第一个所需的节点时,停止遍历

  5. 5

    collection_select不会在集合成员上调用第一个value_method

  6. 6

    collection_select不会在集合成员上调用第一个value_method

  7. 7

    在到达字符串中的第一个p标签之前删除所有li标签

  8. 8

    Mongo db Collection查找从第一个条目返回的结果,而不是从客户端的最后一个条目返回的结果

  9. 9

    如何克隆Collection <T>?

  10. 10

    Rails 3.2.12以依赖于第一个collection_select的选择的形式选择第二个元素

  11. 11

    tensorflow:当张量的第一个暗度为None时,如何外积?

  12. 12

    新的信号在执行过程中在信号处理程序中到达时,如何确定哪个是第一个?

  13. 13

    每当找到类中的第一个匹配项时,如何停止方法.contains()?

  14. 14

    如何停止对第一个错误的验证?

  15. 15

    Net Stop,在第一个服务正在“停止...”时如何停止第二个服务

  16. 16

    DirectCast将一个派生的Collection转换为基本Collection

  17. 17

    Doctrine2 /将Collection元素转移到另一个Collection

  18. 18

    张量流中第一个轴形状的构建条件图为“ None”

  19. 19

    jQuery Loop:当到达幻灯片中的最后一个元素时,返回第一个元素?

  20. 20

    将一个记录限制为Cypher COLLECTION

  21. 21

    一个Collection侦听BackBone中多个模型的更改

  22. 22

    从FreeBSD的Ports Collection中仅下载一个端口

  23. 23

    Collection.insert 不是一个函数 - Meteor

  24. 24

    smali 记录一个 util/collection ArrayList

  25. 25

    两个输入中的第一个结束时如何停止FFMPEG处理?

  26. 26

    当通过反射调用它时,返回Collection的方法将返回一个数组?

  27. 27

    当多个线程访问同一个Collection时发生ConcurrentModificationException

  28. 28

    Rails 4:如何通过AJAX基于另一个collection_select更新一个collection_select?

  29. 29

    Rails 4:如何通过AJAX基于另一个collection_select更新一个collection_select?

热门标签

归档