Kotlin?標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法示例詳解
標(biāo)準(zhǔn)函數(shù)
with
with 的作用是可以在連續(xù)調(diào)用同一對(duì)象的多個(gè)方法時(shí)讓代碼變得更加精簡
val result = with(obj){
//這里是obj的上下文
"value" //with 函數(shù)的返回值
}
看個(gè)例子,例如有一個(gè)水果列表,現(xiàn)在我們想吃完所有水果,并將結(jié)果打印出來
val list = listOf("Apple","Banana","Orange")
val builder = StringBuilder()
builder.append("Start eating fruits\n")
for(fruit in list){
builder.append(fruit).append("\n")
}
builder.append("Ate all fruits.\n")
val result = builder.toString()
print(result)
Start eating fruitsApple
Banana
Orange
Ate all fruits.
我們可以使用 with 讓代碼更簡單
val list = listOf("Apple","Banana","Orange")
val result = with(StringBuffer()){
append("Start eating fruit.\n")
for (fruit in list){
append(fruit+"\n")
}
append("Ate all fruits.\n")
toString()
}
println(result)
我們給 with 函數(shù)第一個(gè)參數(shù)傳入 StringBuilder 對(duì)象,那么接下來整個(gè) Lambda 表達(dá)式的上下文就是這個(gè) StringBuilder。Lambda 表達(dá)式最后一行代碼會(huì)作為 with 函數(shù)的返回值返回
run
首先 run 函數(shù)是不能直接調(diào)用的,而是一定要調(diào)用某個(gè)對(duì)象的 run 函數(shù)才行;其次 run 函數(shù)只接收一個(gè) Lambda 函數(shù),并且會(huì)在 Lambda 表達(dá)式中提供調(diào)用對(duì)象的上下文
val result = obj.run{
//這里是obj的上下文
"value"http://run函數(shù)的返回值
}
val list = listOf("Apple","Banana","Orange")
val result = StringBuilder().run{
append("Start eating fruit.\n")
for (fruit in list){
append(fruit+"\n")
}
append("Ate all fruits.\n")
toString()
}
println(result)
Apply
apply 函數(shù)和 run 函數(shù)極其類似,只不過無法指定返回值,而是會(huì)自動(dòng)返回調(diào)用對(duì)象本身
val result = obj.apply{
//這里是obj的上下文
}
//result == obj
val list = listOf("Apple","Banana","Orange")
val result = StringBuilder().apply{
append("Start eating fruit.\n")
for (fruit in list){
append(fruit+"\n")
}
append("Ate all fruits.\n")
}
println(result.toString())
我們可以使用 apply 對(duì)啟動(dòng) Activity 的代碼進(jìn)行優(yōu)化,傳遞的參數(shù)越多,這種寫法越有優(yōu)勢(shì)
val intent = Intent(this,SecondActivity::class.java).apply {
putExtra("param1","data1")
putExtra("param2","data2")
}
startActivity(intent)
定義靜態(tài)方法
在 Java 中定義一個(gè)靜態(tài)方法非常簡單,只需要在方法前聲明 static 關(guān)鍵字即可
public class Util{
public static void doAction(){
System.out.println("do action");
}
}
調(diào)用的時(shí)候
Util.doActin();
靜態(tài)方法非常適合編寫一些工具類的功能,因?yàn)楣ぞ哳愅ǔ]有創(chuàng)建實(shí)例的必要。而 Kotlin 中推薦使用單例類的方法來實(shí)現(xiàn),例如上述 Util 工具類
object Util {
fun doAction(){
println("do action")
}
}
調(diào)用的時(shí)候
Util.doAction()
不過使用單例類的寫法會(huì)將整個(gè)類的所有方法全部變成類似于靜態(tài)方法的調(diào)用方式,而如果我們只想讓類中某個(gè)方法變成靜態(tài)方法的調(diào)用方式:
class Util {
fun doAction1(){
println("do action1")
}
companion object{
fun doAction2(){
println("do action2")
}
}
}
我們將 Util 變成一個(gè)普通類,doAction1() 方法一定要?jiǎng)?chuàng)建 Util 類的實(shí)例才能調(diào)用,而 doAction2() 可以使用 Util.doAction2() 的方式調(diào)用。doAction2() 方法其實(shí)也不是靜態(tài)方法,companion object 關(guān)鍵字實(shí)際上會(huì)在 Util 類內(nèi)創(chuàng)建一個(gè)伴生類,而 doAction2() 方法就是定義在這個(gè)伴生類里面的實(shí)例方法,只是 Kotlin 會(huì)保證 Util 類始終只會(huì)存在一個(gè)伴生類對(duì)象,因此調(diào)用 Util.doAction2() 方法實(shí)際上就是調(diào)用了 Util 類中伴生對(duì)象的 Util.doAction2() 方法
由此可見 Kotlin 確實(shí)沒有直接定義靜態(tài)方法的關(guān)鍵字,而是提供了一些語法特性來支持類似靜態(tài)方法調(diào)用的寫法,然而如果你確確實(shí)實(shí)需要定義真正的靜態(tài)方法,Kotlin 仍然提供了兩張實(shí)現(xiàn)方式:注解和頂層方法
注解
如果我們給單例類或 Companion object 中的方法加上 @JvmStatic 注解,那么 Kotlin 編譯器就會(huì)將這些方法編譯成真正的靜態(tài)方法:
class Util {
fun doAction1(){
println("do action1")
}
companion object{
@JvmStatic
fun doAction2(){
println("do action2")
}
}
}
注意@JvmStatic注解只能加到單例類或 companion object 中方法上。由于 doAction2() 方法已經(jīng)成為真正的靜態(tài)方法,不管在 Kotlin 還是 Java 中都可以使用 Util.doAction2() 的寫法來調(diào)用了
頂層方法
頂層方法指的是那些沒有定義在任何類中的方法,例如 main() 方法。Kotlin 編譯器會(huì)將所有頂層方法全部編譯成靜態(tài)方法。所以如果你定義了一個(gè)頂層方法,那么它就一定是靜態(tài)方法
現(xiàn)在創(chuàng)建一個(gè) Helper.kt 的 File

現(xiàn)在在這個(gè)文件里定義的任何方法都是頂級(jí)方法
fun doSomething(){
println("do something")
}
所有的頂層方法都可以在任何位置被直接調(diào)用,不用管包名路徑,也不用創(chuàng)建實(shí)例,直接輸入方法名即可:doSomething()。而在 Java 中不同了。Kotlin 編譯器會(huì)自動(dòng)創(chuàng)建一個(gè) HelperKt 的 Java 類,所以使用 HelpterKt.doSomething()即可
classJavaTest {
public void invokeStaticMethod(){
HelperKt . doSome thing();
}
}以上就是Kotlin 標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Kotlin 標(biāo)準(zhǔn)函數(shù)靜態(tài)方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot使用Junit測(cè)試沒有插入數(shù)據(jù)的原因
這篇文章主要介紹了Springboot使用Junit測(cè)試沒有插入數(shù)據(jù)的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
SpringBoot + JPA @ManyToMany的操作要點(diǎn)說明
這篇文章主要介紹了SpringBoot + JPA @ManyToMany的操作要點(diǎn)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景
本文主要介紹了淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景,@Autowired注解在依賴查找方式和注入方式上更加靈活,適用于Spring框架中的依賴注入,而@Inject注解在依賴查找方式上更加嚴(yán)格,適用于Java的依賴注入標(biāo)準(zhǔn),感興趣的可以了解一下2023-11-11
Java調(diào)用echarts提供的地圖壓縮方法來壓縮地圖
今天小編就為大家分享一篇關(guān)于Java調(diào)用echarts提供的地圖壓縮方法來壓縮地圖,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
Java使用Queryable-pageable實(shí)現(xiàn)分頁效果
這篇文章主要為大家介紹了Java如何使用Queryable-pageable從而實(shí)現(xiàn)分頁效果,文中的示例代碼簡潔易懂,感興趣的小伙伴可以動(dòng)手嘗試一下2022-06-06
Java利用MD5加鹽實(shí)現(xiàn)對(duì)密碼進(jìn)行加密處理
在開發(fā)的時(shí)候,有一些敏感信息是不能直接通過明白直接保存到數(shù)據(jù)庫的。最經(jīng)典的就是密碼了。如果直接把密碼以明文的形式入庫,不僅會(huì)泄露用戶的隱私,對(duì)系統(tǒng)也是極其的不厲。本文就來和大家介紹一下如何對(duì)密碼進(jìn)行加密處理,感興趣的可以了解一下2023-02-02

