Android面试Kotlin高阶篇(七)

问:什么是Kotlin高阶函数?有什么作用?

答:高阶函数和Lambda表达式密不可分。接收一个Lambda表达式参数的函数可以称作具有函数式编程风格的API,自定义函数式API需要借助高阶函数来实现。如果一个函数接收另一个函数作为参数或者返回值的类型是另一个函数,则该函数称为高阶函数。

//函数类型定义:
(String, Int) -> Unit
//->左边为函数,右边为返回类型。如果左边没有任何参数,则使用(),右边为函数参数的返回类型。
()->Unit
(String)->String

//高阶函数定义:
fun example(a:Int, b:Int, func : (Int, Int)->Int) : Int{
  return func(a, b)
}
//使用:
//定义一个函数类型参数test,并赋值给func
val func = fun test(a:Int, b:Int){
  return a+b
}
//定一个函数类型test2
fun test2(a:Int, b:Int){
  return a+b
}
//调用
fun main(){
  //变量方式
  val result = example(10, 20, func)    //结果为30
  //引用方式
  val result = example(10, 20, ::test2)  //结果30
  //如果函数类型参数是最后一个参数:
  val result = example(10, 20){n1, n2->  //结果为30
    n1+n2
  }
}

高阶函数作用:高阶函数允许让函数类型的参数来决定函数的执行逻辑,只要传入不同的函数类型参数,执行逻辑和返回结果就可能完全不同。

高阶函数的Lambda表达式在编译后,在底层被转换成了匿名类的实现方式,每一次调用Lambda表达式,都会创建一个新的匿名类实例,就会造成额外的内存和性能开销。为了解决这个问题,就需要使用内联函数,只需要在高阶函数前面加上 inline 关键字即可。

inline fun example(a:Int, b:Int, func:(Int, Int)->Int):Int{
 return func(a, b)
}

Kotlin 编译器会将内联函数中的代码在编译的时候自动替换到调用它的地方。分两步:
1、Kotlin编译器将Lambda表达式中的代码替换到函数类型参数调用的地方
2、将内联函数中的全部代码替换到函数调用的地方

问:Kotlin中委托类和委托属性

答:委托是一种设计模式,基本理念是:操作对象自己不会去处理某段逻辑,而是会把工作委托给另一个辅助对象去处理实现。
委托类:如:我们要自己实现一个Set数据结构的实现类MySet

//将MySet的具体实现交给HashSet
class MySet<T>(val helperSet:HashSet<T>) : Set<T>{
  //此时需要实现Set接口的所有方法,如:未全部实现,太多了...
  override val size:Int
    get() = helperSet.size  //借助helperSet辅助对象,实现MySet.size的实现
  ....
}

此时,如果要实现的接口方法非常非常多的话,那我们自己实现的MySet将非常复杂,要实现很多的方法。在Kotlin中,可以使用by关键字来实现减少模版代码的操作。Kotlin 中委托使用的关键字by,只需要在接口后面使用by关键字,接上受委托的辅助对象:helperSet

class MySet<T>(val helperSet:HashSet<T>) : Set<T> by helperSet{
  //此时就可以选择性的实现的需要的方法,如:
  override fun isEmpty() = false //这里实现了isEmpty方法,并且一直返回false
  //实现自己的一个任意方法
  fun func() = println("Hello World")
}

委托属性 :委托属性的思想是将一个属性(字段)的具体实现交给另一个类完成。

class MyClass{
  var p by Delegate()    //将p字段的具体实现交给Delegate类的实现
}  

class Delegate{
  //需要实现getValue 和 setValue方法,且都被operator(运算符重载)修饰
  var p:Any? = null
  //第一个参数:class  代表可以在什么类中使用。第二个参数:属性操作类,用于获取各种属性相关的值
  operator fun getValue(class:MyClass, prop:KProperty<*>) : Any?{
    return p
  }
  
  operator fun setValue(class:MyClass, prop:KProperty<*>, value:Any?) {
     p = value
  }
  //当在使用p时,就会调用Delegate的setValue、getValue方法
}
问: Kotlin中泛型和Java的泛型有什么不同?

答:
一、泛型实化: Kotlin中的泛型支持对泛型实化 reified 。Java中使用泛型,在JVM编译期时存在约束,编译时进行泛型擦除,真正在运行时已经是具体的类型了。Kotlin提供了内联函数的概念(代码在编译期替换过程),在内联泛型函数中可以使用reified对泛型修饰 ,在Android中使用如:利用泛型实化及高阶函数封装Activity启动

//封装一个startActivity的方法
inline fun <reified T> startActivity(context:Context, block:Intent.()->Unit){
  val intent = Intent(context, T::class.java)
  intent.block()
  context.startActivity(intent)
}

//使用
startActivity<TestActivity>(context){
  putExtra("param1", "Hello World")
  putExtra("param2", 123)
}

二、泛型协变和泛型逆变: 平时几乎不怎么使用,所以对其不是很了解。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容