在 Scala 的集合中查找方法
find method in scala's collection
根据文档,scala 集合中的查找函数将结果元素包装在 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(<console>:13)
at .$anonfun$res19$adapted(<console>:13)
at scala.collection.TraversableLike.$anonfun$filterImpl(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)
这会产生错误,因为您在 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
both should error out / produce correct result
不,他们不应该。
filter()
必须触摸每个元素以查看它是在里面还是在外面。如果 collection 中有炸弹,那么它就会被引爆。
find()
懒惰。找到第一个通过谓词测试的元素,我们就到这里了。一个就完成了。
根据文档,scala 集合中的查找函数将结果元素包装在 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(<console>:13)
at .$anonfun$res19$adapted(<console>:13)
at scala.collection.TraversableLike.$anonfun$filterImpl(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)
这会产生错误,因为您在 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
both should error out / produce correct result
不,他们不应该。
filter()
必须触摸每个元素以查看它是在里面还是在外面。如果 collection 中有炸弹,那么它就会被引爆。
find()
懒惰。找到第一个通过谓词测试的元素,我们就到这里了。一个就完成了。