Сопоставить список опций со списком строк - PullRequest
1 голос
/ 13 января 2020

В последнее время я довольно часто использую Arrow Kotlin, но я все еще не понимаю, как сопоставить список параметров их значениям. Например:

val listOfStrings: List<String> = listOf<Option<String>>().map { /* ? */ }

В настоящее время я делаю это следующим образом:

val listOfStrings: List<String> = listOf<Option<String>>().filter { it.isDefined() }.map { it.getOrElse { "" } }

Но это кажется неуклюжим, и я наверняка что-то упускаю.

Ответы [ 3 ]

3 голосов
/ 13 января 2020

Лично я считаю, что nullable поддержка Kotlin способна обрабатывать nullable с большей грацией, чем стрелка Option, проверьте blogpost , сказав, что некоторые альтернативы будут:

listOf<Option<String>>().mapNotNull { it.orNull() }
listOf<Option<String>>().flatMap { it.toList() }
listOf<Option<String>>().mapNotNull { if (it is Some) it.t else null }
3 голосов
/ 13 января 2020

Вы хотите Haskell catMaybes. : D
Я не знаю, есть ли что-то похожее в Arrow, но вы можете использовать filterMap из arrow.core.extensions.list.monadFilter.filterMap:

fun main() {
    val list = listOf(Some(1), None)

    println(list.filterMap(::identity))
}
// prints: ListK(list=[1])
0 голосов
/ 13 января 2020

Если вы хотите извлечь значение из Option, вам нужно указать значение по умолчанию, если значение отсутствует .

Во второй строке кода вы Вы используете getOrElse для этого. Это правильно и имеет подпись fun <A> Option<A>.getOrElse(f: () -> A): A, что означает, что оно либо возвращает значение настоящее или значение по умолчанию в случае отсутствия .

Решение: Вы можете просто map каждые Option в вашем List до значения, используя getOrElse.

val listOfStrings: List<String> = listOf<Option<String>>().map { it.gerOrElse { "" }  }
...