我想了解更多关于 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()
}
所以现在基本上有两个部分:外部映射和内部过滤器/映射/排序。我真的很想一次性完成这个。
这可能吗?怎么可能?
不,我想你只能这样做:
strings.map(String::doStuff)
要实现此功能,您需要此功能:
inline fun String.doStuff() = this
.filter(Char::isUpperCase)
.map(Char::lowercaseChar)
.sorted()
乍一看这似乎被欺骗了,但实际上从可读性角度来看它会更好。尽管您可以将所有内容放在一个整体函数链中,但如果将列表的处理与字符串操作逻辑分开,情况会更清晰。由于后者并非微不足道,因此与其他部分隔离会受益。