найти метод в коллекции scala - PullRequest
0 голосов
/ 06 мая 2020

Согласно документации, функция find в коллекции scala обертывает результирующие элементы в объект Option. Ниже операция размера завершается ошибкой; где endWith дает правильный результат. Может кто-нибудь помочь мне, почему размер выдает ошибку?

Второй элемент в списке имеет значение null, оба должны выйти из строя / дать правильный результат.

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)

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

оба должны выйти из строя / дать правильный результат

Нет, они не должны.

filter() должен коснуться каждого элемента, чтобы увидеть, находится ли он внутри или снаружи . Если в коллекции есть бомба, то она взорвется.

find() ленив. Найдите 1-й элемент, который пройдет проверку предиката, и мы здесь. Один и готово.

1 голос
/ 06 мая 2020

Это вызывает ошибку, потому что вы вызываете 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
...