2014-01-28 2 views
6
scala> Seq("abc", null).mkString(" ") 
res0: String = abc null 

, но я хочу, чтобы получить «ABC» толькоКак разрешить mkString пропустить null в scala?

Есть ли способ Scala пропустить аннулирует?

+1

Как говорится в старой шутке: «Доктор, доктор, больно, когда я это делаю». «Итак, не делай этого». Используйте 'Option [String]' как ваш тип, а 'None' вместо' null'. –

+1

Мне бы очень хотелось это сделать, но эти нули приходят из Java-кода. Это лучше: Seq (опция («abc»), Option (null)). FlatMap (s => s) .mkString ("")? – NSF

+0

Попробуйте это, затем, отфильтруя, затем изменив код Java. Посмотрите, что быстрее, оставаясь верным. –

ответ

17
scala> val seq = Seq("abc", null, "def") 
seq: Seq[String] = List(abc, null, def) 

scala> seq.flatMap(Option[String]).mkString(" ") 
res0: String = abc def 
+0

+1 для подхода 'flatMap'. Это то, чего я ожидал бы от идиоматической Скалы. Также хорошо знать, что Option (null) надежно возвращает «None» – KChaloux

15

Там всегда Seq("abc", null).filter(_ != null).mkString(" ")

+0

'Seq (" abc ", null) .iterator.filter (_! = Null) .mkString (" ")', чтобы избежать создания промежуточной коллекции. –

+0

@KevinWright У нынешних версий Scala есть 'withFilter' для этого, не так ли? ** Обновление **: просто попробовал - видимо, 'mkString' не работает напрямую с' withFilter' – KChaloux

1

Сочетание ответ Рекс и первый комментарий Эрик:

Seq("abc", null).map(Option(_)).collect{case Some(x) => x}.mkString(" ") 

Первый map упаковывает значения, приводящие к Seq[Option[String]]. collect, то по существу делает filter и map, отбрасывая значения None и оставляя только развернутые значения Some.

+3

'Seq (« abc », null) .flatMap (Option (_)). MkString (" ")'. Сплет делает то, что вы хотите. – dhg

Смежные вопросы