Kotlin map () повторно использовать то же значение - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть следующий метод

    val dateFormat = SimpleDateFormat("yyyy-MM-dd")
    fun parseBirthdateLines(paragraph: String): List<Pair<Date, String>> {
        val lines = paragraph.split("\n")
        return lines.map { l -> Pair(dateFormat.parse(l.split(" ")[0]), l.split(" ")[1]) }
    }

, где l.split(" ") вызывается дважды.

Как писать умнее в стиле функционального программирования?

PS 1: Мне интересно решение с fold, если возможно

PS 2: для удобства чтения оригинальная версия была записана как

 fun parseBirthdateLines(paragraph: String): List<Pair<Date, String>> {
        val lines = paragraph.split("\n")

        var results = mutableListOf<Pair<Date, String>>()
        for (line in lines) {
            val content = line.split(" ")
            val date: Date = dateFormat.parse(content[0])
            val firstName = content[1]
            results.add(Pair(date,firstName))
        }
        return results
    }

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Это немного проще. Я не вижу способа использовать fold, не делая его более запутанным.

val dateFormat = SimpleDateFormat("yyyy-MM-dd")
fun parseBirthdateLines(paragraph: String): List<Pair<Date, String>> =
    paragraph.split("\n")
        .map { 
            with(it.split(" ")) { dateFormat.parse(this[0]) to this[1] }
        }
1 голос
/ 19 февраля 2020

Используйте map дважды и объедините его с деструктуризацией:

val dateFormat = SimpleDateFormat("yyyy-MM-dd")
fun parseBirthdateLines(paragraph: String) =
    paragraph.split("\n").asSequence()
        .map { it.split(" ") }
        .map { (first, second) -> dateFormat.parse(first) to second }.toList()
1 голос
/ 19 февраля 2020

Я считаю, что есть более функциональный и оптимизированный способ написания этого, но вот базовый c fold + с примером:

val dateFormat = SimpleDateFormat("yyyy-MM-dd")

fun parseBirthdateLines(paragraph: String): List<Pair<Date, String>> {
   val lines = paragraph.split("\n")

    return lines.fold(listOf<Pair<Date, String>>()) { list, line -> 
        with (line.split(" ")) {
            list + Pair(dateFormat.parse(this[0]), this[1])
        }        
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...