scala> Seq("abc", null).mkString(" ")
res0: String = abc null
, но я хочу, чтобы получить «ABC» толькоКак разрешить mkString пропустить null в scala?
Есть ли способ Scala пропустить аннулирует?
scala> Seq("abc", null).mkString(" ")
res0: String = abc null
, но я хочу, чтобы получить «ABC» толькоКак разрешить mkString пропустить null в scala?
Есть ли способ Scala пропустить аннулирует?
scala> val seq = Seq("abc", null, "def")
seq: Seq[String] = List(abc, null, def)
scala> seq.flatMap(Option[String]).mkString(" ")
res0: String = abc def
+1 для подхода 'flatMap'. Это то, чего я ожидал бы от идиоматической Скалы. Также хорошо знать, что Option (null) надежно возвращает «None» – KChaloux
Там всегда Seq("abc", null).filter(_ != null).mkString(" ")
'Seq (" abc ", null) .iterator.filter (_! = Null) .mkString (" ")', чтобы избежать создания промежуточной коллекции. –
@KevinWright У нынешних версий Scala есть 'withFilter' для этого, не так ли? ** Обновление **: просто попробовал - видимо, 'mkString' не работает напрямую с' withFilter' – KChaloux
Сочетание ответ Рекс и первый комментарий Эрик:
Seq("abc", null).map(Option(_)).collect{case Some(x) => x}.mkString(" ")
Первый map
упаковывает значения, приводящие к Seq[Option[String]]
. collect
, то по существу делает filter
и map
, отбрасывая значения None
и оставляя только развернутые значения Some
.
'Seq (« abc », null) .flatMap (Option (_)). MkString (" ")'. Сплет делает то, что вы хотите. – dhg
Как говорится в старой шутке: «Доктор, доктор, больно, когда я это делаю». «Итак, не делай этого». Используйте 'Option [String]' как ваш тип, а 'None' вместо' null'. –
Мне бы очень хотелось это сделать, но эти нули приходят из Java-кода. Это лучше: Seq (опция («abc»), Option (null)). FlatMap (s => s) .mkString ("")? – NSF
Попробуйте это, затем, отфильтруя, затем изменив код Java. Посмотрите, что быстрее, оставаясь верным. –