kotlin与Java在Android开发中的简单对比

自从谷歌宣布,kotlin为Android官方的开发语言,它确实火了,因为他有强大的背景,更因为它的安全,简洁
大部分的人会说,我的项目是java,换成kotlin那成本太大了.其实kotlin的开发者早就想到这一点,kotlin官网强调:与java100%的交互.
这让你想到什么?没错,这意味着你不用用kotlin重构整个项目,可以立刻马上现在就kotlin写Android了.接下来我们来看看kotlin…

//Student,Teacher的实体类声明
data class Student(val name: String, val age: Int, val sex: String)

data class Teacher(val name: String, val age: Int, val sex: String)

没错,你再也不用写枯燥无味的get/set方法了,我们在看一段RxJava代码

 //java写法,
 Observable.just("1")
                .map(new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) throws Exception {
                        return Integer.parseInt(s) + 1;          //将"1"转成Integer,并加1
                    }
                })
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        System.out.println(integer);        //打印2
                    }
                });
   //kotlin写法
   Observable.just("1")      
                .map { it.toInt() + 1 }    //String转Int,并+1
                .subscribe { println(it) }  //打印结果:2

从上面可以看出kotlin支持lambda表达式,而java是java8才开始支持,Android是不支持java8的.
细心的同学可能已经发现了,上面kotlin将String转成Int,只需要”1″.toInt,写起来明显更符合面向对象的逻辑,不像java写起来有点繁琐.那么.toInt()的背后是什么呢?

//点进kotlin的源码一看,这货其实还是调用java的,并用kotlin的内联函数,保证不会因为函数入栈,出栈而带来性能损失,额...说得有点多
public inline fun String.toInt(): Int = java.lang.Integer.parseInt(this)

类型自动推导

    //你可以不用生声明类型
    private val age = 1    //用val声明一个不可变的字段(常量)
    private var name = "lin"  //用var声明一个变量

事实上,值不可变的字段,你应该用val声明.在java中,你应该用final关键字修饰.这样你维护代码的时候,一眼看到这个字段就知道它不可能在其他地方被赋值了,如果你不是这样做,修bug,维护这个字段的时候你得小心翼翼.这就是val声明的好处

java的switch 与 kotlin的when

//java代码
 switch (age) {
            case 1:
                System.out.println("刚出生?");
                break;
            case 2:
            case 3:
                System.out.println("长大了");
                break;
            default:
                System.out.println("翅膀硬了...");
        }
//kotlin代码
 when (age) {
            1 -> println("刚出生?")
            2, 3 -> println("长大了")
            else -> print("翅膀硬了...")
        }

你还记得你上一次在java中少写了一个break,而导致的bug吗? 当然kotlin的when还有更强大的操作.

集合操作符

//kotlin写法
      //声明一个Student集合
       val list = listOf(Student("lin", 1, "男"),
                Student("zhang", 2, "女"),
                Student("san", 3, "妖怪"),
                Student("四", 4, "未知"))

        //过滤出所有年龄大于2的学生
        val filterStudents = list.filter { age > 2 }

        //判断是否有一个名字叫"lin"的学生,如果有返回true,反之false
        val hasStudentLin = list.any { it.name == "lin" }

        //计算出男生的个数
        val count = list.count { it.sex == "男" }
//java写法
你可能会这样写
private boolean hasStudentLin(ArrayList<Student> students) {
        for (int i = 0; i < students.size(); i++) {
            Student student = students.get(i);
            if (student.getName().equals("lin")) {
                return true;
            }
        }
        return false;
    }
//你还可能这样写
boolean hasStudentLin;
        for (int i = 0; i < students.size(); i++) {
            Student student = students.get(i);
            if (student.getName().equals("lin")) {
                hasStudentLin = true;
                break;        //是不是有可能你一不小心把break漏掉了,导致多循环n次
            }
        }

kotlin用简单的操作符any,filter ,count就清楚了表达了你想要的逻辑,代码的可读性大大提高,健壮性在某种程度上来说,也算提高了,比如上面student.getName()为null的时候(其实你应该用”lin”来调equals),java的写法就挂掉了,而kotlin则不会。事实上,kotlin还有很多操作符,他们都很实用。

以上的对比只是冰山一角,还有很多没提及,比如kotlin最重要的空安全…后面再慢慢补充…

    原文作者:不灬语
    原文地址: https://www.jianshu.com/p/aeab31ea784e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞