KotlinkotlinKotlin专题

Kotlin学习之常用高阶函数:map

2018-01-11  本文已影响52人  程序员丶星霖

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函数相似,Koltin也提供了一些类似的map函数:

  1. mapIndexed()与mapIndexedTo()函数:都接受两个参数的transform函数,第一个参数是Int类型的索引,第二个参数是被映射的元素类型。
  2. mapIndexedNotNull()与mapIndexedNotNullTo()函数:过滤掉null的映射值。
  3. mapNotNull()与mapNotNullTo()函数:相当于map+filterNotNull,过滤掉了null的映射值,映射后的元素也可能少于映射前。
  4. 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
}

二、实例

输入:字符串,含有多个大小写不一致的单词,使用空格分隔;
输出:字符串,要求将所有字符串调整为首字母大写的形式。

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

joinToString()函数支持传入一个transform函数,所以还可以简化为:

fun String.toTitleCase() =
        split(" ").joinToString(separator = " ") {
            it[0].toUpperCase() + it.substring(1).toLowerCase()
        }
        
println("sHorT SEntEncE".toTitleCase())

学海无涯苦作舟

我的微信公众号.jpg
上一篇 下一篇

猜你喜欢

热点阅读