美文网首页KotlinkotlinKotlin专题
Kotlin学习之常用高阶函数:map

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

作者: 程序员丶星霖 | 来源:发表于2018-01-11 08:53 被阅读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函数后得到的List元素数只会少不会多,而且都是原数组中的数据;
    • 执行map函数后得到的List元素一定与之前一样多,List内的元素一般不会是原数组的数据。

    与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
    }
    
    • 操作上与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())
    

    学海无涯苦作舟

    我的微信公众号.jpg

    相关文章

      网友评论

        本文标题:Kotlin学习之常用高阶函数:map

        本文链接:https://www.haomeiwen.com/subject/miqznxtx.html