網站首頁 編程語言 正文
編程語言的發展,通過需求,不斷的變化出新的特性,而這些特性就會使得編程變得更加的簡潔。
Lambda表達式
Lambda
表達式的出現,一定程度上使得函數和變量慢慢的融為一體,這樣做的好處大大的方便了回調函數的使用。
在很多的情況下,其實我們的函數就只有簡單的幾行代碼,用fun
就感覺有點重了,而且有的時候這么大的函數結構用起來,并不是非常的方便。
Lambda
表達式,其表達式為:?{變量定義 -> 代碼塊}
其中:
lambda 函數是一個可以接收任意多個參數(包括可選參數)并且返回單個表達式值的函數
val sum:(Int,Int) -> Int = {x: Int, y: Int -> x + y} println(sum(1,1))
通常對于求和的代碼,不過是普通的幾句代碼,如果定義一個函數會有點麻煩,這里把函數 看成一個變量,后面我們就可以知道這種寫法的威力。
Lambda
表達式 中,使用(Int,Int) -> Int
來定義變量的類型,也就是函數的類型了。當然這一個Lambda
表達式 可以簡化為:
val sum = {x: Int, y: Int -> x + y} println(sum(1,1))
->
符號代表的是,參數到返回值。
高階函數
函數中帶有以函數為參數,就稱為高階函數,在c語言中,通常是以函數指針傳遞給函數參數,在Kotlin
中會演變的更加的簡單。
如我們定義一個冪函數的算法,
fun powerAlgorithm(x:Int,power:(a:Int)->Int):Int{ return power(x) }
至于多少次方,通過power
來控制。如我們求三次方:
println(powerAlgorithm(2,{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->x:Int->x*x*x}))
結果打印如下:
I/System.out: 8
再看一個更簡便的寫法:
var power3 = powerAlgorithm(2){ it*it*it }
這里有兩點,回調函數我們可以用另外一個{}
中直接編寫,it
是一個隱藏的變量。當 lambda
中只有一個參數時,it
就可以用來代表自己。這就是我們一直講的這個it
,之前我們還不知道怎么一回事。
其實這種寫法 kotlin
中,我們已經非常的常見了,比如map
函數。
map
函數,對每個函數做一次同樣的操作,如 對鏈表中的數據 做兩倍的處理:
var numList:MutableList<Int1> = mutableListOf(1,2,3,4,5) var num2 = numList.map{it*2}
這里的it
就是那么個意思, lambda
中只有一個參數時,it
就可以用來代表自己。
簡化寫法,使用with
和apply
。
tvTest.setText("hello with") tvTest.setBackgroundColor(R.color.white) with(tvTest){ setText("hello with") setBackgroundColor(R.color.white) } tvTest.apply { setText("hello apply") setBackgroundColor(R.color.black) } var str = HashMap<String,kotlin.Int>().apply { this["age"] = 1 this["num"] = 8 }
為了避免tvTest
的多處使用,我們集中在with(tvTest)
中使用,同樣的apply
也可以這樣做,apply
可以在變量初始化的時候做,避免重復的變量多寫了很多次。
還有run
也是同樣的用法,多了一個功能:最后一行會自動被認為是返回值類型
var len:kotlin.Int = str.run { count() }
len
的值這時候為2
小結
我們通過了函數的高級特性,知道了一些Kotlin
很好的特性,這些在后面的編程中,都起到了很好的作用,我們不需要在寫那么多的函數,有的時候還找不到函數定義的地方,Lambda
使得 整個的回調函數看起來非常的簡單,但是如果太熟悉c語言的語法,這可能還重新適應一下。
原文鏈接:https://blog.csdn.net/weixin_40425640/article/details/127878091
相關推薦
- 2022-08-02 C#如何Task執行任務,等待任務完成_C#教程
- 2022-07-30 Linux常見命令-搜索查詢類,find 查找文件或者目錄,locate 快速定位文件路徑,grep
- 2022-01-05 el-select使用了多選時,選中多個會撐開原始高度,樣式錯亂,使用tag展示,一行顯示全部內容,
- 2022-06-27 Golang編程并發工具庫MapReduce使用實踐_Golang
- 2024-03-08 SpringBoot 項目啟動報錯 Failed to configure a DataSource
- 2022-08-29 Python可視化神器pyecharts繪制水球圖_python
- 2022-08-18 C++詳解如何實現單鏈表_C 語言
- 2022-08-12 Qt實現拖動單個控件移動的示例代碼_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支