kotlin命令参数(Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit)
本文目录
- Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit
- kotlin语言实现从Fragment跳转到Activity
- Android Kotlin 将函数作为参数传递
- 使用kotlin扩展Intent传值
- Android kotlin 委托获取 intent 参数
- Kotlin带接收者的lambda表达式
- Kotlin基本语法之(四)成员变量与get、set方法
Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit
Kotlin比Java更方便的地方,其中之一是可以将函数作为参数。
上面三者都是将函数作为其它函数的参数来使用,其形式虽然简单,但理解并不简单。
一、共同点
三者的返回值相同,均为Unit,即没有返回值。
当然有返回值也可以,比如返回一个泛型R,或者是一个具体的值Int等
如:
但是这不是重点,要理解三者,主要是分析前面的部分,这里返回Unit只是为了方便理解。
二、定义形式
可以结合Kotlin自带的作用域函数来理解:
apply:
also:
自定义一个使用()-》Unit的例子:
三、使用
上面的例子说明了以下几点:
1、T.()-》Unit 的函数体中可以直接使用T代表的对象,即用this代表对象
2、(T) -》 Unit 将T表示的对象作为实参通过函数参数传递进来,供函数体使用
3、 ()-》Unit与T表示的对象没有直接联系,只能通过外部T实例的变量来访问对象
四、理解
T.()-》Unit 中用this代表对象,而this的使用一般是一个类的成员函数中用来表示该类的实例对象本身,比如,为Person类加一个函数:
所以我们可以这样理解,T.()-》Unit相当于是给类T定义了一个扩展函数,该函数没有形参,没有返回值,当然我们也可以增加参数与返回值,道理是一样的。
正是因为T.()为T的扩展函数,所以可以在函数体里直接访问T对象的属性或者成员函数。
(T) -》 Unit与 ()-》Unit只是一个普通的函数,一个带有参数,类型为T,另一个没有参数而已。
(T) -》 Unit在使用it表示实参,是Lambda表达式所规定
五、总结
1、()-》Unit与(T) -》 Unit是相同的,只是一个带参,一个不带参
(T) -》 Unit通过形参T可将对象作为实参传给函数,所以函数体里能通过it或者指定名称的方式来访问该对象
2、T.()-》Unit 等同于为T定义了一个无参数的扩展函数,所以在函数体内可以直接通过this或省略来访问T代表的对象
kotlin语言实现从Fragment跳转到Activity
Activity只能转跳到指定的Activity如果想让目标的Activity中进入指定到fragment,那么只需要传递几个参数即可1.使用Intent转跳 Intentintent=newIntent(activity,目标Activity.class);2.用Intent传递一个界面intent.putExtra("page",1); 注意,这个1用于表示第几个界面,viewPager第一个界面是0,第二个界面是1以此类推3.启动ActivitystartActivity(intent);4.在目标Activity中获取这个值Intentintent=getIntent();intpage=intent.getIntExtra("page",0);//第一个参数是取值的key,第二个参数是默认值5.设置fragment转到指定的界面FragemtnMaganger.beginTransaction().replace(R.id.fragment,newFragment).commit();即可当然如果是同一个Activity,转跳不同的Fragment的话,只需要设置ViewPager.setCurrentImte即可
Android Kotlin 将函数作为参数传递
Kotlin支持函数作为参数传递,无需构建对象来包装函数。
1、调用一个无返回的函数作为参数传递为:方法名()-》 Unit
2、调用一个有返回参数的函数作为参数传递为:方法名()-》 返回类型
本篇文章就到这里了,有不足的还望指导,感谢各位
使用kotlin扩展Intent传值
本文章是建立在
利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅
基础上进行调整的,你需要先了解此文章的相关内容再看本文
根据 利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅
最后使用的结果就为
但此需要定义后每一个Activity对应都需要扩展一次参数,个人嫌太麻烦
便把Intent扩展放到底层BaseActivity中,但这样就变得麻烦,id扩展只能为String,但有可能为Int.这样就没办法扩展,于是定义一个Any的委托
主要注意在 intent.putExtra无法传入Any.则在setValue中做了类型判断.这里先做几个简单的类型,自己可根据情况扩展
定义好几个常用参数,这些扩展参数在自己项目中基本够用了,同时定义Any类型,这样也可以减少创建的大量的扩展变量
(定义的这些扩展变量其实也可以设置**作用域中,这样更方便取值,但不确定这种方式会不会有其他影响,并未设置,如果有清楚的小伙伴可以告诉我)
最后在使用时只要在不同activity中取值转换好对应传入值类型
Android kotlin 委托获取 intent 参数
通过 Kotlin 中的两个接口:ReadOnlyProperty 和 ReadWriteProperty,可以方便的实现属性委托或局部委托。对于 val 变量使用 ReadOnlyProperty,而 var 变量实现ReadWriteProperty。
这里通过 kotlin 实现委托获取界面跳转时 intent 传递的数据:
使用姿势:
就这么简单。
Kotlin带接收者的lambda表达式
在学习kotlin协程原理的时候发现了一个比较有意思的东西:
这个block参数的类型是:
suspend是一个关键字,在协程里面用于声明挂起函数,我们先忽略。看后面的 CoroutineScope.() -》 Unit 看起来像是个函数类型,但是比起一般的函数类型又多了前面的” CoroutineScope. “前缀。
这玩意学名叫做 带有接收者的函数类型 ,通过文档我们可以知道它和 扩展函数 类似,允许在函数体内部访问接收者对象的成员。也就是说在lambda内部,传给调用的接收者对象成为隐式的this,我们可以用this去访问它的成员变量。这个时候invoke的第一个参数就是接收者也就是this的值:
然后this也可以省略:
通过kotlin的语法糖我们可以将invoke省略,将with方法写成下面的形式:
由于block的接收者是Person类型的,通过"Person.()-》Unit"这个类型声明,其实我们可以将它看成Person的拓展函数,通过person这个传入的对象去调用,也就是说我们可以将with方法再改成这样的形式:
对kotlin熟悉的同学可能想到了,如果将特定的Person类型改成泛型,然后再将block的返回值返回,就是我们常用的with函数的实现原理:
如果with方法是Person的成员方法,那么输入的person接收者就是this,可以不用特地在方法参数指定。也就是说可以把它去掉写成下面的形式:
这个时候就更像给Person类创建了一个拓展方法。接收者是this,这个this就是我们传入的person变量。然后this同样可以省略,写成下面的形式:
如果我们使用泛型去替代这个特定的Person类,然后将this再返回,就是apply方法的实现原理了:
很多的kotlin DSL就是用上面的带有接收者的lambda函数去实现的,例如anko。我们可以先给ViewGroup声明一个拓展方法textView用于创建TextView添加成子view,然后TextView作为接收者去调用lambda方法block:
然后再声明一个Activity的拓展方法verticalLinearLayout用于创建垂直布局的LinearLayout,然后将这个创建的LinearLayout作为接收者去调用lambda方法block:
所以就有了下面这样的写法,创建一个垂直布局的LinearLayout里面包含两个TextView:
我们对这个dsl进行详细的解析,第一步它调用了Activity的拓展方法verticalLinearLayout,它的接收者是Activity,内部创建了一个LinearLayout返回。并且用它做接收者调用lambda函数,在lambda函数内部调用的textView方法是ViewGroup的拓展函数,它内部创建了一个TextView加入到LinearLayout的子view。并用这个TextView做接收者调再用lambda函数,所以可以直接设置TextView的setText方法和setBackgroundColor方法。
除了上面kotlin内置的with、apply方法和anko的实现之外, 官方文档 也提供了一个比较典型的例子:
html方法接收一个带HTML类型接收者的lambda函数,它在内部自己创建一个HTML的实例去调用这个lambda函数,于是可以在这个lambda函数里面调用HTML的body方法。
通过上面的几个例子,我们已经了解了带接收者的lambda函数的使用方法,我们可以通过这些典型的用法去设计我们自己的DSL使得我们设计的框架更加易用。
Kotlin基本语法之(四)成员变量与get、set方法
在之前的文章中我们讲到,Kotlin类中的属性既可以用关键字 var 声明为可变的,也可以用关键字 val 声明为只读的。
默认情况下,使用var/val声明的属性可通过对象直接访问,即是public修饰的,除非为属性声明private修饰符。
在Kotlin的世界里成员变量也可被子类复写。同方法的复写一样,需要在父类的成员属性前声明open表示可复写,子类声明override表示重写。
默认情况下属性在声明时必须赋值,除非把属性也声明为abstract的,类中有抽象属性时必须声明为抽象类。
非基本类型的不可空类型(val)的属性可延迟初始化赋值,使用 lateinit 实现该功能。只要保证在使用此属性时已赋值即可,若仍未赋值则会抛出属性尚未初始化异常。
若想避免上述异常可以在使用属性前使用isInitialized方法判断。
默认情况下每个属性都具有getter/setter方法
声明一个属性的完整语法如下:
属性初始值、getter/setter是可缺省,如果属性类型可以从初始值或getter中推断出来则也可缺省。val类型的属性不具备setter。
属性的getter/setter均可复写,即自定义访问器。如果我们定义了一个自定义的setter,那么每次给属性赋值时都会调用它。
来看一个例子:
打印结果:
这里需要解释一下,set方法声明的value是参数名,表示属性实际赋值时的那个对象,约定俗成写做value,可以随意写成其他。
field 指向当前属性,field标识符只能用在属性的访问器内。
若想控制setter访问,可以私有化setter。
更多文章:
初中信息技术python编程教学(初中毕业能学会Python吗)
2026年4月16日 10:40
linux下载搜狗输入法(搜狗输入法 for linux 怎么使用)
2026年4月16日 10:20
python多线程join方法(python线程 问题请教,怎么保证子线程执行完毕)
2026年4月16日 10:00
约克空调显示f6故障代码原因分析?怎么看苹果分析与改进里表示拆机的代码
2026年4月16日 09:40
python文字识别(python文字大小对文字识别有影响吗)
2026年4月16日 09:20
kotlin命令参数(Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit)
2026年4月16日 08:40
countif函数使用注意事项(excel中的countif函数怎么用)
2026年4月16日 08:20





