在scala的集合中寻找方法

问题描述 投票:0回答:1

根据文档,scala集合中的find函数将结果元素封装在Option对象中。在下面的例子中,size操作以错误结束,而endsWith则产生了正确的结果。谁能帮帮我,为什么size会出错?

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

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个回答
3
投票

两者都应该错误地结束,产生正确的结果

不,他们不应该。

filter() 必须触摸每一个元素,看看它是在或不在。如果收藏品里有炸弹,那么它就会被引爆。

find() 是偷懒。找出第一个元素通过谓词测试,我们就可以离开这里了。一个就完事了。


1
投票

这将产生一个错误,因为你是在调用 size 关于 null String 其实就是 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
© www.soinside.com 2019 - 2024. All rights reserved.