1 minute read

什么是kotlin

Kotlin是一种在Java虚拟机上执行的静态类型编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言(其实就是IDEA) 他已经被默认为Android的首选开发语言

为什么推荐kt/gradle

因为节省代码量。提高编译速度包括异常处理之类的。 这里就不推荐基础语法了。直接上语法糖。看看大家能怎样减少工作量 而且关键是spring最新版本支持kotlin。并且放弃maven编译。只支持gradle

常见语法糖

空指针判断

var a: String = "abc" // 默认情况下,常规初始化意味着非空
a = null // 编译错误
var b: String? = "abc" // 可以设置为空
b = null // ok
print(b)

明确了可空和不可空不是同一类型。你假如指定了一个可空变成不可空。那么会编译报错。这样就会在编译期间防止空指针异常了 那么除了这个区分类型还有什么用了。有。比如你没有数据的时候你想来个默认值
这个叫 Elvis 操作符

   class A{
       val b:B?
   }
   class B{
       val c:string?
   }

   val a=A();
   a.b==null
   正常情况下假如缺少数据的时候。或者有多层对象的时候。你可以通过这样的写法表示
   val text=a.b?.c?:"默认值"   

那么java推荐模式是什么

    B b=Optional.ofNullable(A.b).orElse(new B())
    String text=Optional.ofNullable(b.text).orElse("")

Getter 和 Setter与Lombok

想必大家都开始用了lombok。有效的减少了开发的工作量。再也不用手写setter和getter方法。但在koltin里面。你申明的方法自动带setter和getter.完全不需要再去写. 相当于内置了Lombok

还可以像python一样修改默认的get和set。实现字段操作的拦截

class a{
    var A:String =""
    set(values){
        field=A+"_"
    }
}

还有完全的数据类

data class A(var A:String="",val b:String="xxx");

data class自动生成构造函数。作为一个纯粹的数据object

模式匹配

想必大家用switch做分支的时候经常会这样使用

public void test1() {
        int item = 3;
        switch (item) {
            case 1:
                System.out.println(1);
                break;
            case 2:
                System.out.println(2);
                break;
            case 3:
                System.out.println(3);
                break;
            default:
                System.out.println(0);
        }
}

kotlin这么写

fun test1() {
        val item = 3
        when (item) {
            1 -> println(1)
            2 -> println(2)
            3 -> println(3)
            else -> println(0)
        }
}

你以为这样就结束了?  
不还可以这样写

```kotlin
fun test1() {
        val item = 3
        when {
            item==1 -> println(1)
            item is Integer -> println(2)
            item*3==9 -> println(3)
            item in 4..9 -> println(9)
            else -> println(0)
        }
}

when 将它的参数与所有的分支条件顺序比较,直到某个分支满足条件。 when 既可以被当做表达式使用也可以被当做语句使用。如果它被当做表达式, 符合条件的分支的值就是整个表达式的值,如果当做语句使用, 则忽略个别分支的值。(像 if 一样,每一个分支可以是一个代码块,它的值是块中最后的表达式的值。)

标准函数

有let,apply,with,run 但这些事干什么用的。又是一个非常棒的语法糖

let 扩展函数是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,可以使用let函数。

object.let{
   it.todo()//在函数体内使用it替代object对象去访问其公有的属性和方法
}

比如如下

	public  void test(String var2) {
        if(var2!=null){
           System.out.println(var2.length());//输出 7
           int result = 1000;
          System.out.println(result); //输出 1000
        }
    }
	public  void test(String arg) {
      arg?.let{
          println(this.length());
          val result=1000;
          println(result*this);
      }
    }

对。这样写可以默认执行某个操作而不影响arg的

那么同样有需求。假如是不为空。我更新var2的值。而为空则不变呢? 就用到run就可以了

	public  void test(String arg) {
      val arg2=arg?.run{
          println(this.length());
          val result=1000;
          return result*this;
      }
    }

inline函数

有时候你想给一个Class添加方法。你却没有编辑的权限。你只能写一个静态方法类。
把原有对象传递进去

public static B AconvertToB(A a){
    B b=new B();
    return b;
}

而在kotlin中。你可以在任意文件中写这样的函数。表示是这个对象才拥有这个方法

 fun A.convertB():B{
    B b=new B();
    return b;
 }

相比找函数。这里可以默认通过A类型找到关联的函数。方便调用和整理

单列模式

在java有个设计模型叫单列模式。大家都清楚。在kotlin里面只要申明是object就行.这个就默认单列模式了

 object A{
     fun a:String()
 }

lambada函数

更简洁和完善的lambada。 比如说java里面生成map类型

         List<LfRchgUnitPrice> list=new ArrayList();
        Map<String, LfRchgUnitPrice> pricesMapper = list.stream().collect(Collectors.toMap(LfRchgUnitPrice::getCorpCode, Function.identity()));

        val list=ArrayList();
        val pricesMapper:Map<String, LfRchgUnitPrice> = list.associateBy{it.getCorpCode()}

没有看错。就这么简单.
assocateBy假如遇到重复的key会默认覆盖。不会报错。但是java就不行
除了这个。还有groupBy(多条数据的时候生成的是List)

     Map<String, List<LfRchgUnitPrice>> = list.groupBy{it.getCorpCode()};

系统默认函数

假如你获取一个数据。假如是用户没有传.是一个String。他有可能是”“.或者是一个非法字符串。或者是其他的。假如出现异常数据。我这些想通通忽略掉。 那java这样写

    public static Integer toInteger(String number){
        try {
            return Integer.valueOf(number);
        }
        catch (Exception e){
            log.error("转换Int失败"+number,e);
            return null;
        }
    }
    public void test()
    {
      toInteger("xxxx")
    }
    val text="xxx"
    val data=A.toIntOrNull()
    #更方便的是可以写成下面样式
    val data=A.toIntOrNull()?:0

自带协程

kotlin 语义默认支持协程。对于一个复杂而耗时的任务。有可能在java里面肯能要调用线程词。而在kotlin里面线程池就可以了

怎么开始

很简单。只要项目是gradle的。可以直接通过简单的配置就变成支持java和kotlin的双语言项目。完全可以做到有些开发java有些开发kotlin。互相不冲突。

一般大家开始的时候都是习惯按java方式写kotlin。这也没关系。但是直到一定时间后就默默的会用起来各种语法糖。而且idea也会提示你怎样的想法更适合kotlin的语法

Updated: