亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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
提交
取消