Kotlin学习之常用高阶函数:map
Map的中文意思是“映射”,它既可以作名词,也可以是动词。
一、Map系列
Array<out T>的map函数如下:
inline fun <T, R> Array<out T>.map(transform: (T) -> R): List<R> {
return mapTo(ArrayList<R>(size), transform)
}
与filter相似,它也是委托给mapTo()方法实现:
inline fun <T, R, C : MutableCollection<in R>> Array<out T>.mapTo(destination: C, transform: (T) -> R): C {
for (item in this)
destination.add(transform(item))
return destination
}
mapTo()函数接受一个(T)->R类型的函数transform,对数组中的每个元素调用一次transform函数,再将返回值添加到destination中。
与filter函数的区别:
- 一个数组在执行filter函数后得到的List元素数只会少不会多,而且都是原数组中的数据;
- 执行map函数后得到的List元素一定与之前一样多,List内的元素一般不会是原数组的数据。
与filter函数相似,Koltin也提供了一些类似的map函数:
- mapIndexed()与mapIndexedTo()函数:都接受两个参数的transform函数,第一个参数是Int类型的索引,第二个参数是被映射的元素类型。
- mapIndexedNotNull()与mapIndexedNotNullTo()函数:过滤掉null的映射值。
- mapNotNull()与mapNotNullTo()函数:相当于map+filterNotNull,过滤掉了null的映射值,映射后的元素也可能少于映射前。
- flatMap()与flatMapTo()函数:这两个函数与其他map函数有所不同,
Array<out T>
的flatMapTo()函数如下:
inline fun <T, R, C : MutableCollection<in R>> Array<out T>.flatMapTo(destination: C, transform: (T) -> Iterable<R>): C {
for (element in this) {
val list = transform(element)
destination.addAll(list)
}
return destination
}
- 操作上与mapTo()没有区别,唯一不同在于flatMap函数接受的transform函数,返回值本身就是一个集合,它会把返回集合中的所有元素添加到destination里。
二、实例
输入:字符串,含有多个大小写不一致的单词,使用空格分隔;
输出:字符串,要求将所有字符串调整为首字母大写的形式。
2.1Java解答
public String toTitleCase(String s) {
String[] strs = s.split(" ");
StringBuilder result = new StringBuilder();
for (String str : strs) {
String newStr = Character.toUpperCase(str.charAt(0))
+ str.substring(1).toLowerCase() + ' ';
result.append(newStr);
}
return result.deleteCharAt(result.length() - 1).toString();
}
2.2Kotlin解答
fun String.toTitleCase() =
split(" ").map {
it[0].toUpperCase() + it.substring(1).toLowerCase()
}.joinToString(separator = " ")
println("sHorT SEntEncE".toTitleCase())
- String.split():通过 split() 函数分割字符串,这一步得到一个
Array<String> = {"sHorT", "SEntEncE"}
; -
Array<out T>.map()
:分别处理分割后的字符串并映射到新的 List 里,需要注意到 Kotlin 字符串可以通过类似数组的方式取指定位置的 char 字符。这一步我们得到一个List<String> = ["Short", "Sentence"]
; -
Iterable<T>.joinToString()
:根据要求将集合联结为字符串,它有 6 个可选的参数,分别指定分隔符、前缀、后缀、最大限制数、省略符和操作函数。
joinToString()函数支持传入一个transform函数,所以还可以简化为:
fun String.toTitleCase() =
split(" ").joinToString(separator = " ") {
it[0].toUpperCase() + it.substring(1).toLowerCase()
}
println("sHorT SEntEncE".toTitleCase())
网友评论