kotlin入门(1)

       谷歌在17年5月的I/O大会上将kotlin语言作为android开发的主推语言,正好机缘巧合下,我们公司6月一个大项目重构进行封闭开发。因为kotlin和java是能混合开发的,几个android小伙伴一合计,就算有坑,那就变成java代码也行,就决定玩起来。到现在为止,过去了9个月,也用kotlin开发了2个项目。自己在部门内部也开过kotlin入门的分享会,今天正好闲来无事,来这边讲一些自己的理解,讲的点会比较乱。主要从4个点来讲。1.什么是kotlin。2.我们通过kotlin能得到什么。3.开发前期的准备工作。4.kotlin的一些基础代码和语法糖(方言)。
       1.什么是kotlin。
Kotlin,它是JetBrains开发的基于JVM的语言。JetBrains因为创造了一个强大的Java开发IDE被大家所熟知。而AndroidStudio,官方的Android IDE,就是基于Intellij。作为一个该平台的插件。
Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。
Kotlin是使用Java开发者的思维被创建的,Intellij作为它主要的开发IDE。对于Android开发者,有两个有趣的特点:
对Java开发者来说,Kotlin是非常直觉化的,并且非常容易学习。语言的大部分内容都是与我们知道的非常相似,不同的地方,它的基础概念也能迅速地掌握它。
它与我们日常生活使用的IDE无需配置就能完全整合。Android Studio能够非常完美地理解、编译运行Kotlin代码。而且对这门语言的支持正是来自于开发了这个IDE的公司本身,所以我们Android开发者是一等公民。
        2.我们通过kotlin能得到什么。
     简单来讲就是,kotlin相比java,能有什么优势。 有以下几点
2.1.易表现:
通过Kotlin,可以更容易地避免模版代码,因为大部分的典型情况都在语言中默认覆盖实现了。举个例子,在Java中,如果我们要典型的数据类,我们需要去编写(至少生成)这些代码,如:
java
public class User  {
    String name;
    String age;
    String sex;
    String birthday;

    public User(String name, String age, String sex, String birthday) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
}

Kotlin

class User(var name: String, var age: String, var sex: String, var birthday: String)

很明显的对比。kotlin并不需要去编写构造方法、setget方法。

2.2 空安全:
当我们使用Java开发的时候,我们的代码大多是防御性的。如果我们不想遇到NullPointerException,我们就需要在使用它之前不停地去判断它是否为null。Kotlin,如很多现代的语言,是空安全的,因为我们需要通过一个安全调用操作符(写做?)来明确地指定一个对象是否能为空。
我们可以像这样去写:
如一个集合(datas)我们需要判断他是否为空,如果不为空就去执行某操作。datas?.let{具体实现} 。 或者如将某不确定是否为空的值赋予 某变量,如果为空就返回空字符:  var str=datas?.name?:"" 。加了?之后,它自己就会对null进行检查。像我之前一个项目返回数据集又长又臭,经常很多值会是空的,如果用java去写就会很麻烦,非空判断写到你想爆炸。而kotlin的?就会帮你去判断。相对?代表会判断检查空,!!则是不检查空 如datas!!.get(0)如果datas就是个空的。就会直接报KotlinNullPointerException。
2.3 扩展方法:

 我们可以给任何类添加函数。它比那些我们项目中典型的工具类更加具有可读性。举个例子,我们项目里常用的跳转:

fun openActivity(goToClass: Class<*>,bundle: Bundle= Bundle(), requestCode: Int=-1000){
    var intent = Intent(this, goToClass)
    intent.putExtras(bundle)
    if (requestCode == -1000) {
        startActivity(intent)
    } else {
        startActivityForResult(intent,requestCode)
    }
}
什么意思呢,看上去代码也不少。他这个的意思就是这个openActivity方法,只有goToClass是必填的。如我可以在调用openActivity(MainActivity::class.java),也可以openActivity(MainActivity::class.java,bundle),以及openActivity(MainActivity::class.java,bundle,1001)。在java里面我们可能要写3个方法去适配,而在kotlin,只用一种。  只需在方法里给非必填的参数给予一个默认值。
2.4 函数式支持(Lambdas):

每次我们去声明一个点击所触发的事件,可以只需要定义我们需要做些什么,而不是不得不去实现一个内部类?我们确实可以这么做,这个(或者其它更多我们感兴趣的事件)我们需要感谢lambda,如下面的点击事件。

java
view.setOnClickListener(new View.OnClickListener() {
          @Override
         public void onClick(View v) {
         toast("Helloworld!") 
   }
}

kotlin
view.setOnClickListener { toast("Helloworld!") } 

  当然这里只是挑选了很小一部分Kotlin可以简化我们代码的事情。

3.开发前期的准备工作.

android studio 3.0及以上是已经装好kotlin插件,如果是3.0以下,请去Settings中plugins栏下载kotlin.建议也可以安装下kotlin-android-extensions,这个插件安装后,我们的控件将不用去findViewById,可以直接用控件id在你的activity或者frament进行操作。安装成功后 你的APP下的gradle里会出现。

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

4.kotlin的一些基础代码和语法糖(方言)。

  当然,我们上面有讲了一些简单的一些语法操作。相信大家从上面能看到,kotlin代码有点类似js

变量的定义:

var代表变量var str="Hellworld"

val代表常量val STR="Hellworld"

而静态常量则是:

class A {
    companion object {
        val TAG = "classA"
    }
}

静态方法同理:往  companion object 里添加方法

函数方法:

kotlin里面方法是fun 方法名(参数名:参数类型):返回参数类型{} 如 fun sum(x:Int,y:Int):Int{x+y}  如果没有返回参数 则不用写”:返回参数类型“,不去指定它的返回值,它就会返回Unit,与Java中的void类似,但是Unit是一个真正的对象。

kotin覆写父类里的方法和属性  默认情况下,Kotin类中的方法和属性都是final的(抽象的方法和属性默认是open的),即不允许被子类覆写,要让其可以被子类覆写,需要在父类的方法和属性前加上open,如一般我们会在基类BaseActivity里去写backbtn方法(点击返回按钮方法)。而有些情况会在子类去对它进行特殊需求。这个时候需要在这个方法前加上open。


类的定义:

在上面的2.1里面我们就定义过了类。具体定义:

class 类名(变量)  如

class User(var name: String, var age: String, var sex: String, var birthday: String)

类的继承:

默认任何类都是基础继承自Any(与java中的Object类似),但是我们可以继承其它类。所有的类默认都是不可继承的(final),所以我们只能继承那些明确声明open或者abstract的类:

class 类名:父类     如 class MainActivity:BaseActivity(){}

类的实现也是用:区分 如MainActivity继承BaseActivity实现某Listener 

class MainActivity:BaseActivity(),Listener {} 用逗号隔开


创建类不需要去"new"如var bundle=Bundle()。

如果要具体实现某类里的某方法如

val handle=object : Handler(){
    override fun handleMessage(msg: Message?) {
        super.handleMessage(msg)
         }
}

需要加个"object:",如果这个工具类里面只有单一方法则不用啊

跳转时,跳转的class需要这样写Activity::class.java



以及

Kotin里并没有switch when替代如:

when(X){

1->{}

2->{}

}

说到这个衍生一点。kotlin可以这样去判断,是字符串则进字符串方法,是数字则进数字方法。

when(X){

is String->{}
is Int->{}
}

for循环和java里面写发也有所不同,java里for(int i=0;i<datas.size;i++)

kotlin里面写法有很多种 如 for(i in datas.indices)  for(i in 0 until datas.size) 都是从0到datas.size-1。

而forEach循环则直接写datas.forEach()  如datas是一个ArrayList<String>要判断datas里的值是否等于"Helloworld"

datas.forEach(
//这里也说下 kotlin里面==就包含了equals,it就代指当前循环里datas的值
if(it=="Helloworld"){
  //具体操作
})

如果我们有个需求,从集合A中取出有"Helloworld"的值 放入集合B中。这个时候就可以用到filter。

  b=A.filter(it==“Helloworld”)  as ArrayList<String>

因为filter返回的是List类型 我们需要强转一下 。as就是kotlin的强转。

kotlin可以把if当表达式如:

var c=if (2> 1) 1 else 2

以及例如我们要如何快速的获取HashMap里的key和value.

在kotlin里面可以

var map=HashMap<String,String>()
map.put("aaaa","aaa")
map.put("bbbb","bbbb")
for ((k, v) in map) {
    Log.i("","$k -> $v")
}

 对于lambda表达式,web前端那边 java8也都有lambda,简单来讲就是匿名函数。很多函数方法 我们就用一次就不用了,还要给它想个名字,你说麻烦。有了lambda就简单多了。lambda表达式可以作为一种类型,就跟String, Int一样。我们可以这样定义一个lambda类型:

val sum:(Int,Int)-> Int= {x, y -> x+y},或者val  sum={y:Int,y:Int->x+y}    这种表达式,我们也可以写作代码块:

fun(x: Int, y: Int): Int = x + y,也可以val sum=fun(x: Int, y: Int): Int = x + y。

目前先分享这些。后续在分享其他的基础语法和语法糖以及一些高阶用法。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值