Kotlin入门笔记(九)集合的函数式编程 API(上)

前言:本教程最好在有JAVA的基础下进行学习

这里先纠正一下《第一行代码 Android 第三版》中的一个问题奥!那时候使用的是 maxBy 函数 ,现在这个函数已经弃用,改为 maxByOrNull 函数 :

Deprecated: Use maxByOrNull instead.

参考:maxBy - Kotlin Programming Language

例题:

如何在一个水果集合内找到单词最长的哪个水果?

或许你会这样写:

val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
var maxLengthFruit = ""
for (fruit in list) {
    if(fruit.length > maxLengthFruit.length) {
        maxLengthFruit = fruit
    }  
}  
println(maxLengthFruit)

不错,但是用上 Kotlin 的函数 API 可以变得更简介:

fun main() {
    val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
    var maxLengthFruit = list.maxByOrNull { it.length }
    println(maxLengthFruit)
}

上述代码使用的就是函数式API的用法,只用一行代码就能找到集合中单词最长的那一个。为什么可以这样写?请继续往下看。

是不是很神奇?

Lambda表达式语法结构

{ 参数名1 : 参数类型 ,  参数名2 : 参数类型   ->   函数体 }

这已经是 Lambda 表达式最完整的写法,很多后续的情况下会更简洁。

回到刚刚的例子,前面使用的函数式API语法结构看上去很特殊,但其实

就是一个普通的函数而已,只不过它接收的参数是一个 Lambda 表达式maxByOrNull函数 的工作原理就是根据传入的集合进行遍历,从而找到该条件的最大值。比如想找的是单词最长的水果,那条件自然就是单词的 长度了。

理解了上面所述的条件,

第一次写的:

val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
var maxLengthFruit = ""
for (fruit in list) {
    if(fruit.length > maxLengthFruit.length) {
        maxLengthFruit = fruit
    }  
}  
println(maxLengthFruit)

 就可以改成:

val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
val lambda = { fruit : String -> fruit.length }
val maxLengthFruit = list.maxByOrNull(lambda)

这样,maxByOrNull函数 就接收了一个 Lamda表达式作为参数。①Kotlin允许直接将Lambda表达式传入函数中。所以我们还可以再缩写:

val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
val maxLengthFruit = list.maxByOrNull({ fruit : String -> fruit.length })

Kotlin 又规定,②当 Lambda参数 是最后一个参数时,可以将 Lambda表达式 移至函数括号的外面。 所以我们继续改进,就变成了:

val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
val maxLengthFruit = list.maxByOrNull(){ fruit : String -> fruit.length }

可是这括号好像多余了...没错。所以 Kotlin 叒 规定,③如果 Lambda参数 是唯一一个参数,还可以将函数的括号省略

val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
val maxLengthFruit = list.maxByOrNull { fruit : String -> fruit.length }

④Kotlin 拥有出色的类型推导机制,所以 Lambda 表达式大多数情况下不必声明参数类,:

val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
val maxLengthFruit = list.maxByOrNull { fruit  -> fruit.length }

但是,⑤Kotlin 叕规定,当 Lambda表达式 二点参数列表只有一个参数的时,也不必声明参数名,而是用 it关键字 来代替,所以代码变成了:

val list = listOf("Apple","Banana","Pear","Grape","Watermelon")
val maxLengthFruit = list.maxByOrNull { it.length }

阿这....

Kotlin 这不是 语法糖 超甜,这是 语法糖 齁咸。他们甜也就算了,他们甜的让我心慌.

                                                                                   ---出自:韩美娟 评价 糖果超甜 语录

开个玩笑哈,言归正传。Kotlin的许多语法糖大大的减少了开发者的代码量。Java恐怕要十行的代码,Kotlin 三行就搞定了。再说说安卓众说周知的 MVC模式 ,Activity 负担巨大。(所以后来比较多人选择了 MVP 与 MVVM 模式)当一个 500行的 Activity 缩短成了100行,这看起来是不是舒服多了?

在文章的结尾我插几张图哈,网上看到的,觉得比较有意思。看着乐呵一下就完啦!生活中有时就是要苦中作乐,不同行业的程序员 斗斗图,拌拌嘴 又何尝不是一件有意思的事情呢 ~ 

如果喜欢这个系列的话,不妨点个关注吧!感谢您的观看!

参考:

        《第一行代码 Android (第三版)》   ---郭霖

猜你喜欢

转载自blog.csdn.net/m0_46745664/article/details/122910240