为了账号安全,请及时绑定邮箱和手机立即绑定

Kotlin 手记 -- Lambda编程

标签:
Kotlin

集合的创建和遍历

    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
    for (fruit in list) {
        println(fruit)
    }

listOf()函数创建的是—个不可变的集合
若需要创建—个可变的集合,使用mutableListOf()函数就可以

	val list = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")

Set集合的用法 换成了setOf()和mutableSetOf()函数而已

传统的Map用法:

val map = HashMap<String, Int>()
map.put("Apple", 1)

在Kotlin中并不建议使用put()和get()方法来对Map进行添加和读取数据操作
更加推荐使用一种类似于数组下标的语法结构

map["Apple"] = 1
val number = map["Apple"]

Kotlin也提供了一对mapOf()和mutableMapOf()函数来继续简化Map的用法

val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)

这里看上去好像是使用to这个关键字来进行关联的,
但其实to并不是关键字,而是一个infix函数

for ((fruit, number) in map) {
    println("fruit is $fruit, number is $number")
}

集合的函数式API

如何在—个水果集合里面找到单词最长的那个水果

    val list = listOf("Apple", "Pear", "", "Banana", "Orange", "Grape", "Watermelon")
    val maxLengthFruit = list.maxBy { it.length } // maxBy { t -> t.length } 的简写
    println("max length fruit is $maxLengthFruit")
  • 筛选 filter
  • 切片 limit skip
  • 去重 distinct
  • 映射 map flatMap
  • 排序 sorted
  • 匹配 allMatch anyMatch noneMatch
  • 查找 findFirst findAny count max min
  • 归约 reduce
  • 搜集 collect
    val list = listOf("Apple", "Pear", "", "Banana", "Orange", "Grape", "Watermelon")
    val list2 = list.filter { it.isNotEmpty() }.sorted().map { "hi $it" }

Lambda的定义:
Lambda就是—小段可以作为参数传递的代码
Lambda表达式的语法结构:
{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}

最外层是—对大括号,如果有参数传入到Lambda表达式中的话,我们还需要声明参数列表,参数列表的结尾使用—个->符号,表示参数列表的结束以及函数体的开始,函数体中可以编写任意行代码,并且最后—行代码会自动作为Lambda表达式的返回值。

由繁入简

maxBy函数的工作原理是根据我们传入的条件来遍历集合,从而找到该条件下的最大值

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

第—步简化

val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })

Kotlin规定,当Lambda参数是函数的最后—个参数时,可以将Lambda表达式移到函数括号的外面

val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }

如果Lambda参数是函数的唯——个参数的话,还可以将函数的括号省略

val maxLengthFruit = list.maxBy { fruit: String -> fruit.length }

由于Kotlin拥有出色的类型推导机制,

val maxLengthFruit = list.maxBy { fruit -> fruit.length }

当Lambda表达式的参数列表中只有—个参数时,也不必声明参数名,而是可以使用it关键字来代替

val maxLengthFruit = list.maxBy { it.length }

常用API

map
用于将集合中的每个元素都映射成—个另外的值,映射的规则在Lambda表达式中指定,最终生成—个新的集合

val newList = list.map { it.toUpperCase() }

filter
用来过滤集合中的数据的

val newList = list.filter { it.length <= 5 }

any和all函数
any 函数用于判断集合中是否至少存在一个元素满足指定条件
all函数用于判断集合中是否所有元素都满足指定条件

val anyResult = list.any { it.length <= 5 }
val allResult = list.all { it.length <= 5 }

sort 排序
distinct 去重

Java函数式API的使用

java 方式

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }
}).start();

new Thread(() -> System.out.println("Thread is running")).start();

kotlin 方式

Thread(object : Runnable {
    override fun run() {
        println("Thread is running")
    }
}).start()

因为Runnable类中只有—个待实现方法,即使这里没有显式地重写run()方法,Kotlin也能自动明白Runnable后面的Lambda表达式就是要在run()方法中实现的内容。
可简化为:

Thread(Runnable {
    println("Thread is running")
}).start()

如果—个Java方法的参数列表中有且仅有—个Java单抽象方法接口参数,我们还可以将接口名进行省略

Thread({
    println("Thread is running")
}).start()

当Lambda表达式是方法的最后—个参数时,可以将Lambda表达式移到方法括号的外面。同时,如果Lambda表达式还是
方法的唯——个参数,还可以将方法的括号省略,最终简化:

Thread {
    println("Thread is running")
}.start()

使用示例:

button.setOnClickListener(new View.OnClickListener() {
	@Override
    public void onClick(View v) {}
});

kotlin中可简化为:

button.setOnClickListener {}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
3
获赞与收藏
0

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消