kotlin命令参数(Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit)

:暂无数据 2026-04-16 08:40:02 0
想知道那些精通kotlin命令参数的人,是如何看待Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit的吗?本篇将为你揭秘他们的思考路径。

本文目录

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。

本文系统阐述了kotlin命令参数及其关键组成部分Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit的定义、特点与关联。更多扩展内容,可参阅相关条目。
本文编辑:admin

更多文章:


初中信息技术python编程教学(初中毕业能学会Python吗)

初中信息技术python编程教学(初中毕业能学会Python吗)

初中信息技术python编程教学的背后,隐藏着怎样的秘密?初中毕业能学会Python吗又在其中扮演了何种角色?带着疑问,我们一起探秘。

2026年4月16日 10:40

linux下载搜狗输入法(搜狗输入法 for linux 怎么使用)

linux下载搜狗输入法(搜狗输入法 for linux 怎么使用)

读懂本文,您将不仅了解linux下载搜狗输入法是什么,更能洞悉搜狗输入法 for linux 怎么使用背后的逻辑,从而举一反三。

2026年4月16日 10:20

python多线程join方法(python线程 问题请教,怎么保证子线程执行完毕)

python多线程join方法(python线程 问题请教,怎么保证子线程执行完毕)

本文是您理解python多线程join方法的最后一站。我们将通过剖析python线程 问题请教,怎么保证子线程执行完毕,帮你打通任督二脉,彻底领悟。

2026年4月16日 10:00

约克空调显示f6故障代码原因分析?怎么看苹果分析与改进里表示拆机的代码

约克空调显示f6故障代码原因分析?怎么看苹果分析与改进里表示拆机的代码

这篇文章给大家聊聊关于代码分析,以及约克空调显示f6故障代码原因分析对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年4月16日 09:40

python文字识别(python文字大小对文字识别有影响吗)

python文字识别(python文字大小对文字识别有影响吗)

读懂本文,您将不仅了解python文字识别是什么,更能洞悉python文字大小对文字识别有影响吗背后的逻辑,从而举一反三。

2026年4月16日 09:20

excel教程哪个好(想学学excel,找什么课程比较好)

excel教程哪个好(想学学excel,找什么课程比较好)

最新数据显示,关注excel教程哪个好的人中,超过70%都对想学学excel,找什么课程比较好抱有浓厚兴趣。本文将满足这一核心需求。

2026年4月16日 09:00

kotlin命令参数(Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit)

kotlin命令参数(Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit)

想知道那些精通kotlin命令参数的人,是如何看待Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit的吗?本篇将为你揭秘他们的思考路径。

2026年4月16日 08:40

countif函数使用注意事项(excel中的countif函数怎么用)

countif函数使用注意事项(excel中的countif函数怎么用)

有没有觉得countif函数使用注意事项听起来很高深?别怕,今天我们就把它和excel中的countif函数怎么用一起,拆解成易懂的小知识点。

2026年4月16日 08:20

linux原理与应用(Linux是什么)

linux原理与应用(Linux是什么)

从我第一次听说linux原理与应用到真正弄懂Linux是什么,也走过一些弯路。下面就把我的学习心得分享给大家,希望能让您的入门之路更顺畅。

2026年4月16日 08:00

二位数乘二位数速算法(二位数乘二位数速算法)

二位数乘二位数速算法(二位数乘二位数速算法)

从一个常见的误区说起:很多人学二位数乘二位数速算法,却忽略了二位数乘二位数速算法。结果事倍功半。希望你不会再犯这个错误。

2026年4月16日 07:40

最近更新

linux原理与应用(Linux是什么)
2026-04-16 08:00:02 浏览:0
热门文章

繁体字转换器(繁体字转化)
2026-04-04 18:00:01 浏览:0
androidbc(bc8-android是什么手机型号)
2026-04-05 07:20:02 浏览:0
标签列表