我想更多地了解Kotlin,特别是流媒体.我基本上只是做一些家庭作业(job)练习.

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

这并不难:

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()
}

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

这可能吗?如何可能?

推荐答案

不,我认为你只能做这样的事情:

strings.map(String::doStuff)

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

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

乍一看,这似乎是作弊的,但实际上就可读性(*)而言,它更好.尽管您将所有内容都放在一个单一的函数链中,但如果您将列表的处理与字符串操作逻辑分开,情况会更清楚.由于后者并不微不足道,因此它受益于与其他事物隔离.

(*):显然,除了函数名称之外.您应该 Select 更好地描述此函数的功能.

Kotlin相关问答推荐

创建具有共同父类型的两种不同类型对象的列表的最有效方法是什么?

Jetpack Compose Material3和Material2 Slider onValueChangeFinded()的行为不同

collectAsState 未从存储库接收更改

如何使用 Kotlin Maven 更改 Minecraft 插件中的 Shulker GUI 标题

kotlin 父类具有依赖于抽象变量的变量

Kotlin 函数有 2 个参数用于对 Map 或 List 进行排序

你怎么知道什么时候需要 yield()?

Kotlin:如何使用第一个参数的默认值进行函数调用并为第二个参数传递一个值?

对列表中数字的子集求和

将 jetpack compose 添加到现有元素

DatabaseManager_Impl 不是抽象的,不会覆盖 RoomDatabase 中的抽象方法 clearAllTables()

片段内的 Kotlin 按钮 onClickListener 事件

Kotlin:找不到符号类片段或其他 android 类

Kotlin get字段注释始终为空

Firestore - 如何在 Kotlin 中排除数据类对象的字段

如何解决:将Java类转换为Kotlin后出现error: cannot find symbol class ...?

Kotlin中OnclickListener方法之间的差异

Kotlin out-projected 类型禁止使用

在android java类中使用Kotlin扩展

尾随 lambda 语法(Kotlin)的目的是什么?