你还在把Java当成Android官方开发语言吗?Kotlin了解一下!
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件注Android)**[外链图片转存中…(img-qxAxFDan-1711824254783)]由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件[外链图片转存中…(img-LgxhUxTh-1711824254783)][外链图片转存中…
fun MutableList?.swap(index1:Int,index2:Int){
if(this == null){
println(null)
return
}
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
3.4 我们有时候还希望能够添加类似JAVA的“静态函数”的扩展函数,这时需要借助“伴随对象(Companion Object)”来实现,如下这个例子:
class D{
companion object{
val m = 1
}
}
fun D.Companion.foo(){
println(“$m in extension”)
}
D.foo()
上面的例子会输出1 in extension,注意这里调用foo这个扩展函数时,并不需要类D的实例,类似于JAVA的静态方法。
3.5 如果留意前面的例子,我们会发现kotlin的this语法和JAVA不同,使用范围更灵活,仅以扩展函数为例,当在扩展函数里调用this时,指代的是接受者类型的实例,那么如果这个扩展函数声明在一个类内部,我们如何通过this获取到类的实例呢?可以参考下面的例子:
class E{
fun foo(){
println(“foo in Class E”)
}
}
class F{
fun foo(){
println(“foo in Class F”)
}
fun E.foo2(){
this.foo()
this@F.foo()
}
}
E().foo2()
这里使用了kotlin的this指定语法,关键字是@,后接指定的类型,上述例子的输出结果是
foo in Class E
foo in Class F
4. 扩展函数的作用域
一般来说,我们习惯将扩展函数直接定义在包内,例如:
package com.example.extension
fun MutableList.swap(index1:Int,index2:Int) {
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
这样,在同一个包内可以直接调用改扩展函数,如果我们需要跨包调用扩展函数,我们需要通过import来指明,以上述的例子为例,可以通过import com.example.extension.swap来指定这个扩展函数,也可以通过import com.example.extension.*表示引入该包内的所有扩展函数。得益于Android Studio具备的自动联想能力,通常不需要我们主动输入import指令。
有时候,我们也会把扩展函数定义在类的内部,例如:
class G {
fun Int.foo(){
println(“foo in Class G”)
}
}
这里的Int.foo()是一个定义在类G内部的扩展函数,在这个扩展函数里,我们直接使用Int类型作为接受者类型,因为我们将扩展函数定义在了类的内部,即使我们设置访问权限为public,它也只能在该类或者该类的子类中被访问,如果我们设置访问权限为private,那么在子类中也不能访问这个扩展函数。
5. 扩展函数的实际应用
5.1 Utils工具类
在JAVA中,我们习惯将工具类命名成*Utils,例如FileUtils,StringUtils等等,著名的java.util.Collections也是这么实现的。调用这些方法的时候,总觉得这些类名碍手碍脚的,例如这样:
// Java
Collections.swap(list, Collections.binarySearch(list, Collections.max(otherList)), Collections.max(list));
Collections.max(list));
通过静态引用,能让情况看起来好一点,例如这样:
// Java
swap(list, binarySearch(list, max(otherList)), max(list));
但是这样既没有IDE的自动联想提示,方法调用的主体也显得不明确。如果能做成下面这样就好了:
// Java
list.swap(list.binarySearch(otherList.max()), list.max());
但是list是JAVA默认的基础类,在JAVA语言里,如果不使用继承,肯定是没法做到这样的,而在Kotlin中就可以借助扩展函数来实现啦。
5.2 Android View 胶水代码
回到最开始的例子,对于Android开发来说,对findViewById()这个方法一定不会陌生,为了获取一个View对象,我们总得先调用findViewById()然后再执行类型转换,这样无意义的胶水代码让Activity或者Fragment显得臃肿无比,例如:
// JAVA
public class MainJavaActivity extends Activity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView label = (TextView) findViewById(R.id.label);
Button btn = (Button) findViewById(R.id.btn);
label.setText(“hello”);
label.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(“Glen”,“onClick TextView”);
}
});
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.d(“Glen”,“onClick Button”);
}
});
}
}
我们考虑利用扩展函数结合泛型,避免频繁的类型转换,扩展函数定义如下:
//kotlin
fun Activity.find(@IdRes id: Int): T {
return findViewById(id) as T
}
调用的时候,如下:
// Kotlin
…
TextView label = find(R.id.label);
Button btn = find(R.id.btn);
…
只是我们还是需要获取到label,btn,这样无意义的中间变量,如果在Int类上扩展,可以直接对R.id.*操作,这样更直接,再结合高阶函数,函数定义如下:
//Kotlin
fun Int.setText(str:String){
val label = find(this).apply {
text = str
}
}
fun Int.onClick(click: ()->Unit){
val tmp = find(this).apply {
setOnClickListener{
click()
}
}
}
我们就可以这样调用:
//Kotlin
R.id.label.setText(“hello”)
R.id.label.onClick { Log.d(“Glen”,“onClick TextView”) }
R.id.btn.onClick { Log.d(“Glen”,“onClick Button”) }
通常这些扩展函数可以放到基类中,根据扩展函数的作用域知识,我们可以在所有子类中都调用到这些方法,所以kotlin的Activity可以写成:
// Kotlin
class MainKotlinActivity:KotlinBaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
R.id.label.setText(“hello”)
R.id.label.onClick { Log.d(“Glen”,“onClick TextView”) }
R.id.btn.onClick { Log.d(“Glen”,“onClick Button”) }
}
}
从原来JAVA冗余的20多行代码,精简到只需要3行代码,而且代码可读性更高,更加直观,这便是函数式编程语言Kotlin的强大威力。
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。






既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件



注Android)**
[外链图片转存中…(img-qxAxFDan-1711824254783)]
最后
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件
[外链图片转存中…(img-LgxhUxTh-1711824254783)]
[外链图片转存中…(img-GBkw5NgJ-1711824254783)]
[外链图片转存中…(img-4DBbBdAE-1711824254784)]
更多推荐
所有评论(0)