初识kotlin(初用kotlin一时爽、一直用一直爽)
kotlin历程
- 2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言
- 2012年2月,JetBrains以Apache 2许可证开源此项目
- 2016年2月15日,Kotlin v1.0发布。这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性
- 2017年,Google宣布在Android上为Kotlin提供一等支持
kotlin的优势
- 比java 更快
如下:创建1000000 个对象
public class JPerson {
public JPerson(String name, Integer age, Integer sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
private String name ;
private Integer age;
private Integer sex ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
}
执行结果
public class ReflectDemo {
public static void main(String[] args) throws InterruptedException {
int i =0;
long start = System.currentTimeMillis();
while (i<1000000){
JPerson jPerson = new JPerson("zhangsan",1,1);
i++ ;
}
long end = System.currentTimeMillis();
System.out.println("java本次耗时:"+(end-start));
}
}
data class KPerson(val name: String, val age: Int, val sex: Int)
fun main(args: Array<String>) {
var i = 0
val start = System.currentTimeMillis()
while (i < 1000000) {
val kPerson = KPerson("张三", 1, 1)
i = i.inc()
}
val end = System.currentTimeMillis()
println("kotlin本次耗时:${(end - start)}")
}
执行结果
3. 比java 语法更简洁、下面是一些简单示例,对kotlin 语法不太理解没关系、后续会对kotlin有详细讲解文章
//Java
System.out.print("hello world");
System.out.println("hello world");
//Kotlin 省略 System.out
print("hello world")
println("hello world")
//Java
String name = "hello world";
final String name = "hello world";
//Kotlin 自动类型推断
var name = "hello world"
val name = "hello world"
//Java
if (text != null) {
int length = text.length();
}
//Kotlin 省略if 判断以及括号,可以使用it代替text
text?.let {
val length = it.length
}
//Java
String firstName = "Android";
String lastName = "Architect";
String message = "My name is: " + firstName + " " + lastName;
//Kotlin 直接使用插值运算符
val firstName = "Android"
val lastName = "Architect"
val message = "My name is: $firstName $lastName"
//Java
String text = "First Line\n" +
"Second Line\n" +
"Third Line";
//Kotlin 写法更加优雅
val text = """
|First Line
|Second Line
|Third Line
""".trimMargin()
//Java
Car car = (Car) object;
//Kotlin 使用as 转换 而且转换后后续无需再次转换
var car = object as Car
car.name // 可以直接使用car 属性
//Java
int score = // some score;
String grade;
switch (score) {
case 10:
case 9:
grade = "Excellent";
break;
case 8:
case 7:
case 6:
grade = "Good";
break;
case 5:
case 4:
grade = "OK";
break;
case 3:
case 2:
case 1:
grade = "Fail";
break;
default:
grade = "Fail";
}
//Kotlin
var score = // some score
var grade = when (score) {
9, 10 -> "Excellent"
in 6..8 -> "Good"
4, 5 -> "OK"
in 1..3 -> "Fail"
else -> "Fail"
}
// labamda表达式 Java 8+
cars.stream().filter(car -> car.speed > 100).forEach(car -> System.out.println(car.speed));
//Kotlin
cars.forEach {
println(it.speed)
}
cars.filter { it.speed > 100 }
.forEach { println(it.speed)}
//Java 静态方法,私有构造比较
public class Utils {
private Utils() {
// This utility class is not publicly instantiable
}
public static int getScore(int value) {
return 2 * value;
}
}
//Kotlin
class Utils private constructor() {
companion object {
fun getScore(value: Int): Int {
return 2 * value
}
}
}
// java 对象声明
public class JPerson {
public JPerson(String name, Integer age, Integer sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
private String name ;
private Integer age;
private Integer sex ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
}
// kotlin
data class KPerson(val name: String, val age: Int, val sex: Int)
-
让它比Java更安全,能够静态检测常见的陷阱。如:引用空指针
-
更高级特性,比如运算符重载,扩展函数
运算符重载 对象可以-加减乘除了
data class Point(val x: Int, val y: Int) {
operator fun plus(other: Point) = Point(x + other.x, y + other.y)
operator fun plus(value: Int) = "toString: ${Point(x + value, y + value)}"
}
fun main(args: Array<String>) {
val p1 = Point(1, 2)
val p2 = Point(3, 4)
println(p1 + p2)
println(p1 + 3)
}
/*
Point(x=4, y=6)
toString: Point(x=4, y=5)
*/
扩展函数,person 类没有order 这个函数,却可以在类的外部给其声明方法
6. 支持协程.让开发更简单
下面并行代码、如果串行执行需要5s,实际执行结果只需要2s、也就是单个任务最大耗时,并行代码比java 简单
@Test
fun checkRunBlocking() {
val start = System.currentTimeMillis()
runBlocking {
launch {
println("launch1")
delay(1000)
// Thread.sleep(1000)
println("launch1 finished")
}
launch {
println("launch2")
delay(1000)
// Thread.sleep(1000)
println("launch2 finished")
}
launch {
println("launch2")
delay(1000)
// Thread.sleep(1000)
println("launch2 finished")
}
launch {
println("launch2")
delay(1000)
// Thread.sleep(1000)
println("launch2 finished")
}
launch {
println("launch2")
delay(2000)
// Thread.sleep(1000)
println("launch2 finished")
}
}
// Thread.sleep(1000)
val end = System.currentTimeMillis()
println("本次耗时:${end - start}")
}
- Kotlin可以编译成Java字节码,也可以编译成JavaScript,前后端可公用一套模型 、后面会单独创建一个项目来讲解这块内容
仓库
https://gitcode.net/mid120/kotlin
总结
从java 转kotlin 刚开始觉得kotlin语法很怪异,比如每行最后不需要加分号,但总是莫名的加上,结果idea 提示是灰色,然后又把分号干掉。然后就是简单写法、很容易让代码看起来是声明方法,实际是调用方法。再加上项目压力,很容易写出一半是kotlin 一半是java 代码。但是时间长久之后,慢慢发现kotlin的简单写法,会干掉大部分java代码,公司项目重构就是用kotlin 替换java ,代码直接少了75%,相当给力。所以,kotlin还是非常优秀的语言,抓紧时间学习吧