Строка добавляется с помощью Null Check Kotlin - PullRequest
0 голосов
/ 26 октября 2018

Каким будет идеологический способ добавить строку с проверкой NULL? Возможно, это глупый вопрос, но мне любопытно узнать, как лучше.

Я пробовал это -

fun main(args: Array<String>) {
    val foo: String? = null
    val bar = "bar"

    println("__println(\"\$foo \$bar\")")
    println("$foo $bar")

    println("__println((if (foo != null) \"\$foo \" else \"\") + (if (bar != null) \"\$bar \" else \"\"))")
    println((if (foo != null) "$foo " else "") + (if (bar != null) "$bar " else ""))

    println("__println((\"\$foo \" ?: \"\") + (\"\$bar \" ?: \"\"))")
    println(("$foo " ?: "") + ("$bar " ?: ""))

    println("__println((foo ?: \"\") + (bar ?: \"\"))")
    println((foo ?: "") + (bar ?: ""))

    println("__println(foo + \" \" + bar)")
    println(foo + " " + bar)

    var string = ""
    if (foo != null) string += "$foo, "
    if (bar != null) string += "$bar"
    println("__println(string)")
    println(string)
}

выход

__println("$foo $bar")
null bar
__println((if (foo != null) "$foo " else "") + (if (bar != null) "$bar " else ""))
bar 
__println(("$foo " ?: "") + ("$bar " ?: ""))
null bar 
__println((foo ?: "") + (bar ?: ""))
bar
__println(foo + " " + bar)
null bar
__println(string)
bar

Назначение

У меня есть класс данных местоположения, у меня есть address_line_1, город, штат, страна и т. Д.

Я хочу получить полную строку адреса с добавлением всех полей с нулевой проверкой. Обратите внимание, что я хочу добавить пробел и запятую также, когда значение не равно NULL.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Встречные вопросы: что вы хотите добавить вместо? а какие у тебя предпочтения?

Если мне нужно значение по умолчанию, я использую foo ?: "<default>".

Если все в порядке, если напечатано null, я просто сохраняю это как есть, т.е. "$foo $bar".

Если вместо этого вы просто хотите объединить список строк, которые могут содержать или не содержать null значений, вас также может заинтересовать что-то вроде следующего:

listOfNotNull(foo, bar).joinToString(" ")

Теперь по поводу вашего обновления вопроса ... Предполагая что-то вроде следующего в качестве класса данных:

data class Location(val line1 : String?, val line2 : String?, val line3part1 : String?, val line3part2 : String?)

Возможное использование listOfNotNull при условии, что пустые строки не должны печататься, может выглядеть так:

with(yourLocation) {
        // the outer listOfNotNull contains the lines:
        listOfNotNull(
            line1,
            line2,
            // inner ListOfNotNulls are specific concatenations, which may lead to an empty line (that's why takeIf is also here)
            listOfNotNull(line3part1, line3part2).takeIf { it.isNotEmpty() }
                ?.joinToString(" ")
            ).joinToString("\n")
    }.run(::println)
}

Если вам потребуется что-то вроде "($nullable)", я бы пошел на:

nullable?.let { "($it)" }

, который затем может быть использован в пределах listOfNotNull.

0 голосов
/ 26 октября 2018

используйте эту логику

var foo: String? = null
var bar = "bar"

foo?.let { foo += bar }?: run { foo="" }
println(foo)  // null not print

foo?.let { bar.let { foo += bar } }
println(foo)   //output is  bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...