无需外部地图即可转换列表项

问题描述 投票:0回答:1

我想了解更多关于 Kotlin,特别是流的知识。我基本上只是做一些家庭作业。

一个练习如下:从包含大写和小写字母的字符串列表开始。过滤掉小写字母,将剩余的大写字母转换为小写,然后按字母顺序排序。

这并不难:

val strings: List<String> = listOf(...)

return strings
        .flatMap { it.toList() }
        .filter(Char::isUpperCase)
        .map(Char::lowercaseChar)
        .sorted()

此解决方案创建了列表中所有内容的列表,但为了我自己,我想做同样的事情,但然后是每个字符串。所以它会返回一个

List<List<Char>>

我唯一能想到的是

return strings.map { str ->
    str.filter(Char::isUpperCase)
        .map(Char::lowercaseChar)
        .sorted()
}

所以现在基本上有两个部分:外部映射和内部过滤器/映射/排序。我真的很想一次性完成这个。

这可能吗?怎么可能?

kotlin
1个回答
0
投票

不,我想你只能这样做:

strings.map(String::doStuff)

要实现此功能,您需要此功能:

inline fun String.doStuff() = this
    .filter(Char::isUpperCase)
    .map(Char::lowercaseChar)
    .sorted()

乍一看这似乎被欺骗了,但实际上从可读性角度来看它会更好。尽管您可以将所有内容放在一个整体函数链中,但如果将列表的处理与字符串操作逻辑分开,情况会更清晰。由于后者并非微不足道,因此与其他部分隔离会受益。

© www.soinside.com 2019 - 2024. All rights reserved.