国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

寧波網(wǎng)站建設(shè)在線智慧軟文網(wǎng)站

寧波網(wǎng)站建設(shè)在線,智慧軟文網(wǎng)站,免費(fèi)做網(wǎng)站軟件視頻,重慶網(wǎng)站推廣怎么樣kotlin高階函數(shù) 函數(shù)式API:一個(gè)函數(shù)的入?yún)?shù)為L(zhǎng)ambda表達(dá)式的函數(shù)就是函數(shù)式api 例子: public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {return filterTo(ArrayList<T>(), predicate) }上面這段函數(shù): 首先這個(gè)函…

kotlin高階函數(shù)

函數(shù)式API:一個(gè)函數(shù)的入?yún)?shù)為L(zhǎng)ambda表達(dá)式的函數(shù)就是函數(shù)式api
例子:

public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {return filterTo(ArrayList<T>(), predicate)
}

上面這段函數(shù): 首先這個(gè)函數(shù)是一個(gè)泛型函數(shù)
泛型函數(shù)的定義:就是我們?cè)趯?xiě)完一個(gè)函數(shù)后,只知道一個(gè)總的類(lèi)型,而這個(gè)總的類(lèi)型下有很多繼承了這個(gè)總類(lèi)型的類(lèi),在返回時(shí)我們不知道這個(gè)函數(shù)具體返回哪個(gè)子類(lèi),這時(shí)我們就可以在這個(gè)函數(shù)前面加一個(gè)泛型,泛型中放這些子類(lèi)的基類(lèi),上面的filter方法也可以看作 Iterable的擴(kuò)展方法

例子:

// A為基類(lèi)
public class A{}
public class  B extends A{}public class  C extends A{}	

// 我們不知道下面這個(gè)方法具體返回A,B,C到底哪一個(gè)類(lèi)型時(shí),因?yàn)轭?lèi)B和C繼承自A,這時(shí)我們就可以將這個(gè)返回類(lèi)型指定為基類(lèi)型A

public static <A> test(){}

下面我寫(xiě)kotlin的寫(xiě)法

class ReportV2Controller : Controller(){
}

和上面java一樣有多個(gè)類(lèi)繼承自Controller()這個(gè)類(lèi),kotlin中繼承都是以函數(shù)的形式,因?yàn)檫@樣寫(xiě)直觀的表現(xiàn)了自類(lèi)具體會(huì)調(diào)用基類(lèi)的哪個(gè)構(gòu)造函數(shù)

	public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {return filterTo(ArrayList<T>(), predicate)
}		

上面的filter方法是迭代集合Iterable,但是在kotlin中這個(gè)Iterable是一個(gè)被inline修飾的內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)的出現(xiàn)的原因:
1.首先在kotlin中有高階函數(shù)的原因,因?yàn)楦唠A函數(shù)的傳參可以是一個(gè)函數(shù),而且出參也可以為一個(gè)函數(shù)

// 下面這段代碼原作者為csdn: Mr YiRan
fun num1AndNum2(num1:Int,num2:Int,operator:(Int,Int)->Int):Int{val result=operator(num1,num2)return result
}

上面這段代碼高階函數(shù)num1AndNum2入?yún)閮蓚€(gè)Int類(lèi)型與一個(gè)函數(shù)類(lèi)型operator,這個(gè)operator又接收兩個(gè)int類(lèi)型的參數(shù),這個(gè)operator返回類(lèi)型為int,operator返回的類(lèi)型int同時(shí)也是num1AndNum2高階函數(shù)的返回類(lèi)型,同時(shí)num1AndNum2函數(shù)的入?yún)?shù),也可以當(dāng)作函數(shù)operator的入?yún)?/p>

fun num1AndNum2(num1:Int,num2:Int,operator:(Int,Int)->Int):Int{val result=operator(num1,num2)return result
}// 定義兩個(gè)具體的運(yùn)算函數(shù)
fun plus(num1: Int,num2: Int):Int{
return num1+num2   
}
fun minus(num1: Int,num2: Int):Int{return num1-num2
}fun main(){val num1=100val num2=80// 這是一個(gè)函數(shù)引用方式的寫(xiě)法,表示將plus()和minus()函數(shù)作為參數(shù)傳遞給num1AndNum2()函數(shù)val result1= num1AndNum2(num1,num2,::plus)val result2 = num1AndNum2(num1, num2, ::minus)println("result1 is $result1")println("result2 is $result2")
}fun main(){
val num1=100
val num2=80
// 上面的函數(shù)引用寫(xiě)法的調(diào)用可以改為L(zhǎng)ambda表達(dá)式的方式來(lái)調(diào)用高階函數(shù)
val result1=num1AndNum2(num1,num2){ n1,n2 ->
n1+n2
}
val result2=num1AndNum2(num1,num2){ n1,n2 ->
n1-n2
}
println("result1 is $result1")
println("result2 is $result2")
}

Lambda表達(dá)式的優(yōu)點(diǎn)與缺點(diǎn)

優(yōu)點(diǎn) :
如果一個(gè)抽象類(lèi)或者接口中只有一個(gè)方法,我們又不想實(shí)例化這個(gè)類(lèi)的對(duì)象就想調(diào)用這個(gè)方法,而且也不想將這個(gè)類(lèi)中的方法標(biāo)記為靜態(tài)的方法,就可以用匿名內(nèi)部類(lèi)的方式類(lèi)寫(xiě),但是這樣寫(xiě)代碼很不美觀,所以就簡(jiǎn)化成Lambda表達(dá)式的方式來(lái)寫(xiě)

缺點(diǎn):
Lambda表達(dá)式的方式,系統(tǒng)會(huì)默認(rèn)實(shí)例化一個(gè)匿名內(nèi)部類(lèi)的方式,就會(huì)造成額外的內(nèi)存開(kāi)銷(xiāo)與cpu性能損耗
因?yàn)榫退愀唠A函數(shù)中的傳參寫(xiě)成Lambda表達(dá)式的方式,其內(nèi)部運(yùn)行順序也為先實(shí)例化最外層類(lèi)的對(duì)象,然后通過(guò)對(duì)象去引用當(dāng)前這個(gè)對(duì)象的方法,將當(dāng)前對(duì)象的方法存入方法區(qū)進(jìn)行壓棧然后再實(shí)例化一個(gè)Lambda表達(dá)式的匿名內(nèi)部類(lèi),再通過(guò)這個(gè)對(duì)象去引用這個(gè)匿名內(nèi)部類(lèi)中的方法,再進(jìn)行壓榨

kotlin是如何解決這種因?yàn)閭魅隠ambda表達(dá)式寫(xiě)法的性能開(kāi)銷(xiāo)的

內(nèi)聯(lián)函數(shù)

在定義高階函數(shù)時(shí)加上inline關(guān)鍵字,就表示此高階函數(shù)是一個(gè)內(nèi)聯(lián)函數(shù)

inline fun num1AndNum2(num1:Int,num2:Int,operation:(Int,Int)->Int):Int{
val result=operation(num1,num2)
return result
}

如何消除 Lambda表達(dá)式額外開(kāi)銷(xiāo)
簡(jiǎn)單來(lái)說(shuō)就是:在調(diào)用傳參為 Lambda表達(dá)式的高階函數(shù)時(shí),將 Lambda表達(dá)式的函數(shù)體直接拷貝在調(diào)用參數(shù)為 Lambda表達(dá)式的高階函數(shù)后方
示例
在這里插入圖片描述
在這里插入圖片描述
1.首先將 Lambda表達(dá)式的入?yún)⒖截惖胶瘮?shù)類(lèi)型參數(shù)的參數(shù)入?yún)⒘斜碇?br /> 2.其次再將內(nèi)聯(lián)函數(shù)的方法體拷貝到調(diào)用該高階函數(shù)的地方
3.總結(jié)為:將實(shí)例化匿名內(nèi)部類(lèi)調(diào)用方法壓棧改為方法入?yún)?shù)拷貝和方法體拷貝的過(guò)程

下面給一個(gè)返回值是一個(gè)函數(shù)的高階函數(shù)
示例

/**

  • 定義一個(gè)返回值是函數(shù)的高階函數(shù)
  • @param name 入場(chǎng)
  • @return 返回一個(gè)函數(shù)或者lambda
    */
    fun highFunction2(name:String):(Int) -> Int{
    if (name == “A”){
    // 這里返回一個(gè)函數(shù)引用,意思調(diào)用returnFun函數(shù)
    // 上面的highFunction2函數(shù)入?yún)閮蓚€(gè)一個(gè)String類(lèi)型的name,還有一個(gè)入?yún)⑹且粋€(gè)參數(shù)為一個(gè)int類(lèi)型的Lambda表達(dá)式
    // 如果想調(diào)用returnFun函數(shù)那highFunction2函數(shù)傳入的Lambda表達(dá)式入?yún)㈩?lèi),數(shù)量與順序必須完全與函數(shù)returnFun一致
    return ::returnFun
    }
    //返回lambda
    return {a -> a + 10}
    }

/**

  • 作為高階函數(shù)的返回函數(shù)
    */
    fun returnFun(a:Int):Int{
    return a * 100
    }
//使用高階函數(shù)
val res = highFunction2("A")
println(res(20)) //打印2000
val res2 = highFunction2("B")
println(res2(20)) //打印30

擴(kuò)展函數(shù)

fun main() {open class Shapeclass Rectangle: Shape()fun Shape.getName() = "Shape"fun Rectangle.getName() = "Rectangle"fun printClassName(s: Shape) {println(s.getName())}    printClassName(Rectangle())

上面函數(shù)的最終返回結(jié)果是打印"Shape",因?yàn)殡m然printClassName的函數(shù)的傳入?yún)?shù)是Rectangle()函數(shù),但是最終會(huì)調(diào)用Shape類(lèi)的getName()函數(shù),這是因?yàn)樽罱K返回的類(lèi)型取決于printClassName函數(shù)傳入?yún)?shù)s的類(lèi)型

成員函數(shù)與擴(kuò)展函數(shù)

如果一個(gè)類(lèi)定義有一個(gè)成員函數(shù)與一個(gè)擴(kuò)展函數(shù),而這兩個(gè)函數(shù)又有相同的接收者類(lèi)型、 相同的名字,并且都適用給定的參數(shù),這種情況總是取成員函數(shù)
示例

fun main() {class Example {fun printFunctionType() { println("Class method") }}fun Example.printFunctionType() { println("Extension function") }Example().printFunctionType()
}

這里最后會(huì)輸出:“Class method”,因?yàn)槭且灶?lèi)的成員函數(shù)為準(zhǔn)的,優(yōu)先級(jí)為先成員函數(shù)
如果是擴(kuò)展類(lèi)型的重載,那么以傳入?yún)?shù)為準(zhǔn)
由于靜態(tài)調(diào)用擴(kuò)展方法是在編譯時(shí)執(zhí)行,因此,如果父類(lèi)和子類(lèi)都擴(kuò)展了同名的一個(gè)擴(kuò)展方法,引用類(lèi)型均為父類(lèi)的情況下,會(huì)調(diào)用父類(lèi)的擴(kuò)展方法
示例

fun main() {class Example {fun printFunctionType() { println("Class method") }}fun Example.printFunctionType(i: Int) { println("Extension function") }Example().printFunctionType(1)
}

最后輸出結(jié)果為:Extension function

top-level函數(shù)

不依賴(lài)于任何類(lèi)的靜態(tài)函數(shù),經(jīng)Kotlin編譯成Java文件后,成為:<靜態(tài)函數(shù)所在的文件名> + "Kt"的Java類(lèi)的靜態(tài)成員函數(shù)。如果原kotlin文件的文件名首字母為小寫(xiě)時(shí),轉(zhuǎn)換成大寫(xiě)。
示例

/** joinsample.kt */
package com.example.kotlinimport java.lang.StringBuilderfun <T> joinToString(collection: Collection<T>,separator: String = ", ",prefix: String = "",postfix: String = ""
): String {val result = StringBuilder(prefix)for ((index, element) in collection.withIndex()) {if (index > 0) {result.append(separator)}result.append(element)}result.append(postfix)return result.toString()
}
import com.example.kotlin.JoinsampleKt;
import java.util.Arrays;
import java.util.List;public class JavaSample {public static void main(String[] args) {List<String> list = Arrays.asList("hello", "world");JoinsampleKt.joinToString(list, ", ", "", "");}
}

擴(kuò)展屬性

由于擴(kuò)展沒(méi)有實(shí)際的將成員插入類(lèi)中,因此對(duì)擴(kuò)展屬性來(lái)說(shuō)幕后字段是無(wú)效的。這就是為什么擴(kuò)展屬性不能有初始化器。他們的行為只能由顯式提供的 getters/setters 定義。

擴(kuò)展聲明為成員

就是說(shuō)有兩個(gè)類(lèi),可以在其中一個(gè)類(lèi)中為另一個(gè)類(lèi)聲明一個(gè)擴(kuò)展函數(shù),被聲明的擴(kuò)展函數(shù),此時(shí)是當(dāng)前類(lèi)的成員函數(shù)

示例

class Host(val hostname: String) {fun printHostname() { print(hostname) }
}class Connection(val host: Host, val port: Int) {fun printPort() { print(port) }// 這里可以為Host類(lèi)定義擴(kuò)展函數(shù),是因?yàn)轭?lèi)Connection的主構(gòu)造函數(shù)中將Host類(lèi)傳入進(jìn)來(lái)fun Host.printConnectionString() {printHostname()   // 調(diào)用 Host.printHostname()print(":")printPort()   // 調(diào)用 Connection.printPort()}fun connect() {/*……*/host.printConnectionString()   // 調(diào)用擴(kuò)展函數(shù)}
}fun main() {// 這里直接使用類(lèi)Connection的主構(gòu)造函數(shù)傳入Host類(lèi)然后調(diào)用Host的主構(gòu)造函數(shù),然后調(diào)用Host類(lèi)的printHostname()函數(shù)// 被定義的擴(kuò)展函數(shù)必須在定義該擴(kuò)展函數(shù)的類(lèi)中使用// 意思就是說(shuō)Host的printConnectionString()函數(shù)必須在類(lèi)Connection中使用//  Connection(Host("kotl.in"),443).printConnectionString()Connection(Host("kotl.in"), 443).connect()//Host("kotl.in").printConnectionString(443)  // 錯(cuò)誤,該擴(kuò)展函數(shù)在 Connection 外不可用
}
class Connection {// 這里給Host類(lèi)定義一個(gè)擴(kuò)展函數(shù)// 在這個(gè)擴(kuò)展函數(shù)中調(diào)用toString()// 因?yàn)樵趉otlin中所有的類(lèi)都繼承自Any類(lèi),而toString方法是屬于Any類(lèi)的// 如果想調(diào)用Connection類(lèi)的toString()方法需要向下面那種寫(xiě)法// this@Connection.toString()fun Host.getConnectionString() {toString()         // 調(diào)用 Host.toString()this@Connection.toString()  // 調(diào)用 Connection.toString()}
}

泛型中的in和out

這兩個(gè)泛型的定義為逆變與攜變
示例

// 逆變
interface Consumer<in T> {fun consume(item: T)
}

簡(jiǎn)單來(lái)說(shuō)就是在接口中in標(biāo)記的泛型類(lèi)型T,要作為函數(shù)consume的入?yún)㈩?lèi)型

// 攜變
interface Production<out T> {fun produce(): T
}

簡(jiǎn)單來(lái)說(shuō)就是接口泛型中out標(biāo)記的T要做為函數(shù)produce返回的類(lèi)型

http://aloenet.com.cn/news/32717.html

相關(guān)文章:

  • 南昌有限公司 網(wǎng)站灰色詞排名代做
  • wordpress地址和站點(diǎn)url金華百度seo
  • python做網(wǎng)站快么鄭州外貿(mào)網(wǎng)站推廣
  • 百度做網(wǎng)站的電話百度置頂廣告多少錢(qián)
  • 德陽(yáng)哪里有做網(wǎng)站的windows優(yōu)化大師是官方的嗎
  • 網(wǎng)站微信建設(shè)運(yùn)營(yíng)經(jīng)驗(yàn)分享沈陽(yáng)疫情最新消息
  • 鄭州做裝飾的網(wǎng)站友情鏈接交易網(wǎng)
  • 公司做網(wǎng)站讓我們銷(xiāo)售百度點(diǎn)擊排名收費(fèi)軟件
  • 重慶建設(shè)安全員信息網(wǎng)站seo實(shí)訓(xùn)報(bào)告
  • 自己做投票網(wǎng)站怎么弄公司域名查詢(xún)官網(wǎng)
  • 重慶網(wǎng)站制作那家好愛(ài)站小工具
  • 2023年電腦端網(wǎng)游濟(jì)南百度推廣優(yōu)化
  • 西安哪里做網(wǎng)站最大鄭州seo顧問(wèn)
  • 國(guó)內(nèi)做批發(fā)的網(wǎng)站百度醫(yī)生在線問(wèn)診
  • 網(wǎng)站集約化建設(shè)紀(jì)要網(wǎng)站案例分析
  • wordpress關(guān)注微信登陸廈門(mén)seo總部電話
  • 開(kāi)發(fā)網(wǎng)站的步驟百度電腦版下載官網(wǎng)
  • 柳州做網(wǎng)站有kv網(wǎng)絡(luò)營(yíng)銷(xiāo)八大職能
  • 網(wǎng)站不備案可以做淘寶客嗎營(yíng)銷(xiāo)推廣公司案例
  • 網(wǎng)站設(shè)計(jì)精美案例電腦培訓(xùn)學(xué)校哪家好
  • 修改wordpress版權(quán)搜索引擎優(yōu)化是指
  • 建企業(yè)網(wǎng)站哪家好百度云搜索引擎入口
  • 邢臺(tái)企業(yè)做網(wǎng)站搜索關(guān)鍵詞的網(wǎng)站
  • 網(wǎng)站建設(shè)困難嗎企業(yè)宣傳推廣方案
  • wordpress 滑塊驗(yàn)證碼搜索引擎優(yōu)化教材答案
  • wordpress在服務(wù)器上安裝插件上海谷歌seo推廣公司
  • 企業(yè)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)優(yōu)惠成人教育培訓(xùn)機(jī)構(gòu)
  • html5手機(jī)網(wǎng)站發(fā)布阿里云注冊(cè)域名
  • 運(yùn)濤網(wǎng)站建設(shè)南昌網(wǎng)站seo外包服務(wù)
  • 在什么網(wǎng)站做推廣最好鞍山seo公司