当前位置: 首页 > news >正文

初识kotlin(初用kotlin一时爽、一直用一直爽)

kotlin历程

  1. 2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言
  2. 2012年2月,JetBrains以Apache 2许可证开源此项目
  3. 2016年2月15日,Kotlin v1.0发布。这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性
  4. 2017年,Google宣布在Android上为Kotlin提供一等支持

kotlin的优势

  1. 比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)
     
  1. 让它比Java更安全,能够静态检测常见的陷阱。如:引用空指针
    在这里插入图片描述

  2. 更高级特性,比如运算符重载,扩展函数

运算符重载 对象可以-加减乘除了

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}")

    }

在这里插入图片描述

  1. Kotlin可以编译成Java字节码,也可以编译成JavaScript,前后端可公用一套模型 、后面会单独创建一个项目来讲解这块内容

仓库

 https://gitcode.net/mid120/kotlin

在这里插入图片描述

总结

从java 转kotlin 刚开始觉得kotlin语法很怪异,比如每行最后不需要加分号,但总是莫名的加上,结果idea 提示是灰色,然后又把分号干掉。然后就是简单写法、很容易让代码看起来是声明方法,实际是调用方法。再加上项目压力,很容易写出一半是kotlin 一半是java 代码。但是时间长久之后,慢慢发现kotlin的简单写法,会干掉大部分java代码,公司项目重构就是用kotlin 替换java ,代码直接少了75%,相当给力。所以,kotlin还是非常优秀的语言,抓紧时间学习吧

相关文章:

  • 测试用到的测试工具总结一手
  • 【Vue五分钟】五分钟了解webpack实战配置案例详情
  • 如何让iOS设备上App定时执行后台任务(上)
  • 面试中遇到的错题(持续更新)
  • 还在为sql注入眼花缭乱的过滤而烦恼?一文教您快速找出所有过滤内容
  • vue中的插槽slot
  • 搭建Redis主从复制、哨兵模式
  • 深度解析ArrayList使用
  • 吴恩达深度学习笔记(六)——超参数调试、Batch正则化和程序框架
  • 【甄选靶场】Vulnhub百个项目渗透——项目十六:FristiLeaks_1.3(文件上传,py脚本改写,sudo提权,脏牛提权,源码获取)
  • 苹果iPhone手机iOS16如何取消关闭复制粘贴时不停弹出的剪贴板粘贴提示通知弹窗?
  • Android移动应用开发之ImageView、ProgressBar和Notification的一些简单使用
  • SQL经典练习题(openGauss数据库)上
  • CSDN编程竞赛-第六期(下)
  • Spring 静态属性赋值 @value 注入静态属性 @Value注解用法
  • 【EOS】Cleos基础
  • ERLANG 网工修炼笔记 ---- UDP
  • ES6之路之模块详解
  • github从入门到放弃(1)
  • js
  • JS数组方法汇总
  • leetcode讲解--894. All Possible Full Binary Trees
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 基于HAProxy的高性能缓存服务器nuster
  • 微信小程序填坑清单
  • 我是如何设计 Upload 上传组件的
  • 新手搭建网站的主要流程
  • 一个项目push到多个远程Git仓库
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • %@ page import=%的用法
  • (10)STL算法之搜索(二) 二分查找
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2022 CVPR) Unbiased Teacher v2
  • (35)远程识别(又称无人机识别)(二)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)Controller接口控制器详解(三)
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转载)虚函数剖析
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net 调用海康SDK以及常见的坑解释
  • .NET 事件模型教程(二)
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池