【问题标题】:find method in scala's collection在 scala 的集合中查找方法
【发布时间】:2020-05-06 03:52:20
【问题描述】:

根据文档,scala 集合中的 find 函数将结果元素包装在 Option 对象中。在下面,大小操作以错误结束;作为 endsWith 产生正确的结果。有人可以帮我解释一下为什么尺寸会出错吗?

列表中的第二个元素为空,两者都应该出错/产生正确的结果。

val a1:String = "ABCDEF"
val a2:String = null
val res12 = List(ABCDEF, null)

res12 filter { _.size > 10 }              //errors out
java.lang.NullPointerException
  at scala.collection.immutable.StringOps$.length$extension(StringOps.scala:51)
  at scala.collection.immutable.StringOps.length(StringOps.scala:51)
  at scala.collection.SeqLike.size(SeqLike.scala:108)
  at scala.collection.SeqLike.size$(SeqLike.scala:108)
  at scala.collection.immutable.StringOps.size(StringOps.scala:33)
  at .$anonfun$res19$1(<console>:13)
  at .$anonfun$res19$1$adapted(<console>:13)
  at scala.collection.TraversableLike.$anonfun$filterImpl$1(TraversableLike.scala:251)
  at scala.collection.immutable.List.foreach(List.scala:392)
  at scala.collection.TraversableLike.filterImpl(TraversableLike.scala:250)
  at scala.collection.TraversableLike.filterImpl$(TraversableLike.scala:248)
  at scala.collection.AbstractTraversable.filterImpl(Traversable.scala:108)
  at scala.collection.TraversableLike.filter(TraversableLike.scala:262)
  at scala.collection.TraversableLike.filter$(TraversableLike.scala:262)
  at scala.collection.AbstractTraversable.filter(Traversable.scala:108)
  ... 28 elided

res12 find { _.endsWith("EF") }       //produces correct result
res20: Option[String] = Some(ABCDEF)

【问题讨论】:

    标签: scala collections option


    【解决方案1】:

    两者都应该出错/产生正确的结果

    不,他们不应该。

    filter() 必须触摸每个元素以查看它是进还是出。如果收藏中有炸弹,那么它就会被引爆。

    find() 很懒惰。找到第一个通过谓词测试的元素,我们就在这里了。一个就完成了。

    【讨论】:

    • 感谢 jwvh,我刚刚交换了列表中的元素顺序,现在我得到了异常。另一方面,我正在研究 Scala 集合中的 Option 用法。当我们有一个仅由 Option 对象(Some 和 None)组成的集合,并且如果我们在集合上应用任何方法(例如:map、filter、fold),这些方法将不会处理 None。我说的对吗?
    • @user3103957,没有。该方法将处理哪些元素(在这种情况下应用提供的函数)取决于该方法。正如@jwvh 指出的find() 是懒惰的,并且在第一次匹配后停止迭代。 filtermapfold 等方法将函数应用于集合中的所有元素
    • @user3103957; None 元素的处理方式与其他元素一样:listOfOptions.count(_.isEmpty)
    • @user3103957;当您flatten 一组选项时,None 元素不会被跳过,它们会被删除,为此必须对它们进行询问(处理)以确定它们是否值得删除。与List(List(2,3),List(),List(9,1)).flatten 相同。空的List 不会被“跳过”,它会像其他人一样被处理。
    • List("ABC").map(e =&gt; List("XYZ")) 返回List(List(XYZ)) 在我看来并没有太大的不同。
    【解决方案2】:

    这会产生错误,因为您在 null String 上调用 size,实际上是 NullPointerException

    scala> val s: String = null
    val s: String = null
    
    scala> s.size
    java.lang.NullPointerException
      at scala.collection.StringOps$.size$extension(StringOps.scala:165)
      ... 32 elided
    

    【讨论】:

      猜你喜欢
      • 2018-05-26
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 2011-01-12
      相关资源
      最近更新 更多