千家信息网

Kotlin初学者指南

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,你好,世界Kotlin是一种静态类型语言,在JVM上运行,并且与现有Java代码具有100%的互操作性。 对于大多数Java开发人员来说,下面的程序应该非常熟悉:包 com。bugsnag。科特林 ;
千家信息网最后更新 2026年11月03日Kotlin初学者指南

你好,世界

Kotlin是一种静态类型语言,在JVM上运行,并且与现有Java代码具有100%的互操作性。 对于大多数Java开发人员来说,下面的程序应该非常熟悉:

包 com。bugsnag。科特林 ;

公共 课 App {
    public  static  void  main(String [] args){
        系统。出。println("Hello World!");
    }
}


以下将在 Kotlin中 打印"Hello World" :

fun  main(args:Array < String >){
    println("Hello World!")
}


一些差异是显而易见的,例如缺少分号以及我们的代码是多么简洁。

科特林与 Java的

为了了解Kotlin,让我们仔细看看它的功能以及它们与Java的比较。

无安全性

我们将首先探索Kotlin最有用的功能之一 - 它支持null安全性。 在Java中,任何对象都可以 null 。 这意味着必须在整个代码库中添加运行时检查以防止 NullPointerException 崩溃,这通常被 语言设计者 称为 十亿美元的错误 。

静态 类 用户 {
    字符串 名称 ;
}

public  void  printUsername(User  user){
    如果(用户。名字 !=  空){
        FOO(用户。名。长度());
    }
}


在Kotlin中,对象的引用必须是可空的或非空的:

class  User(var  name:String ?)// name属性可以为null
class  User(var  name:String)// name属性不能为null


如果开发人员试图将可以为空的对象传递给第二个类,则会发生编译时错误。

安全呼叫运营商

以下对大多数Java开发人员来说非常熟悉。 所述 user 参数可以是 null ,所以需要运行时检查以确保 NPE 避免。

void  printUsername(User  user){
    如果(用户。的getName()!=  空){
        FOO(用户。的getName()长度());
    } else {
        foo(null); //提供一个null整数
    }
}

void  foo(整数 长度){}


Kotlin可以通过 Safe Call 操作员 简化这一过程 。 如果 name 不为null,则其长度将作为参数传递。 否则,将传递空引用。

fun  printUsername(user:User){
    FOO(用户。名字?。长度)如果user.name为空//返回null
}

fun  foo(length:Int ?){}


或者,如果在值为null时执行代码没有意义,我们可以使用 let :

fun  foo(nullableUser:User ?){
    nullableUser ?。let { printUsername(nullableUser)} //只打印非空用户名
}
fun  printUsername(user:User){} // User是非空引用


类定义

与Java相比, Kotlin 类 非常简洁。 下面的类定义了三个字段,getter和setter超过30行!

class  User {
    最终 字符串 名称 ;
    int  age  =  18 ;
    字符串 地址 ;

    public  User(String  name,int  age,String  address){
        这个。name  =  name ;
        这个。年龄 =  年龄 ;
        这个。地址 =  地址 ;
    }

    public  String  getName(){
        返回 名称 ;
    }

    public  int  getAge(){
        回归 年龄 ;
    }

    public  void  setAge(int  age){
        这个。年龄 =  年龄 ;
    }

    public  String  getAddress(){
        返回 地址 ;
    }

    public  void  setAddress(String  address){
        这个。地址 =  地址 ;
    }
}


在Kotlin中,我们可以使用一行代码实现相同的功能。

class  User(val  name:String,var  age:Int  =  18,var  address:String ?)


不可变引用也更容易。 这只是从 var 关键字 切换 到的问题 val 。

您可能已经注意到,对于Kotlin,可以为参数提供默认值。 这意味着 可以在Kotlin中消除 Java模式,例如 Builder模式 。 这也可以大大减少语法糖所需的代码量,例如公共API中的方法链。

数据类

如果我们类的主要目的是保存数据,例如来自API的JSON有效负载,事情会变得更加简洁。 在Kotlin中,这些被称为 数据类 。

data  class  User(val  name:String,var  age:Int  =  18,var  address:String ?)


只需添加 data 关键字会自动生成 equals() , hashCode() , toString() ,并 copy() 为我们的类实现。 省略了此类的等效Java实现,以节省读者的理智和带宽成本。

类型推断

Kotlin使用类型推断,这进一步增加了它的简洁性。 考虑一下这个Java类:

class  AbstractSingletonProxyFactoryBean {}

public  void  foo(){
    AbstractSingletonProxyFactoryBean  bean  =  new  AbstractSingletonProxyFactoryBean();
}


而Kotlin中的等价物看起来像这样:

class  AbstractSingletonProxyFactoryBean

fun  foo(){
    val  bean  =  AbstractSingletonProxyFactoryBean()//自动推断类型
}


功能

类型推断渗透到整个语言中。 在需要时可以是显式的或隐式的,如下面定义相同函数的两种方法所示:

int  add(int  a,int  b){
    返回 a  +  b ;
}


fun  add(a:Int,b:Int):Int { //显式返回类型
    返回 a  +  b
}

fun  add(a:Int,b:Int)=  a  +  b  //推断的返回类型


属性

Kotlin Properties 简直太棒了。 考虑以下Java类,它使用访问器方法定义单个字段:

class  Book {
    字符串 作者 ;

    String  getAuthor(){
        回归 作者 ;
    }

    void  setAuthor(String  author){
        这个。作者 =  作者 ;
    }
}

书 书 =  新的 图书();
书。setAuthor("Kurt Vonnegut");
系统。出。的println(书。getAuthor());


通过定义声明 author 属性 的类,可以在Kotlin的四行中实现等效功能 。 我们将自动生成我们的getter和setter:

class  Book(var  author:String ?)
val  book  =  书()
书。author  =  "Kurt Vonnegut"
println(书。作者)


自定义访问者

如果getter和setter需要自定义行为,则可以覆盖默认行为。 例如:

class  Person(var  firstName:String,var  lastName:String){

    var  fullName:String
        get()=  "$ {firstName} $ {lastName}"
        set(value){
            val  split  =  value。拆分("")
            firstName  =  split [ 0 ]
            lastName  =  split [ 1 ]
        }
}


如果我们需要验证字段或将其限制为某些输入, 也可以使用 支持字段 :

set(value){
    如果("圣诞老人"。等于(值))字段 =  "蚝HO"
}


互通性

Kotlin的另一个优点是可以从同一个项目中的Java代码中调用它,反之亦然。

公共 类 MyJavaClass {
    public  String  authorName ;

    public  boolean  isTruthyValue(){
        返回 true ;
    }
}


以下Kotlin函数实例化一个新的Java对象,并使用常规的Kotlin语法访问其方法和字段。 如果您想通过向现有Java代码库添加少量Kotlin来将脚趾浸入水中,这将非常方便。

fun  main(args:Array < String >){
    val  obj  =  MyJavaClass()
    的println(OBJ。AUTHORNAME)
    的println(OBJ。isTruthyValue)
}


还值得一提的是,Kotlin可以 反编译回Java ,因此如果您的团队不喜欢该语言或遇到技术障碍,那么完全可以迁移回来。

实用方法

所有Java开发人员都会非常熟悉实用程序或帮助程序类。 静态方法将执行Java标准库中不可用的一些有用操作,并将在代码库中调用:

class  StringUtils {
    static  String  sortStringChars(String  input){
        char [] chars  =  输入。toCharArray();
        数组。排序(字符);
        return  new  String(chars);
    }
}
StringUtils。sortStringChars("azbso"); //返回"abosz"


在Kotlin中, 扩展 允许将其他功能添加到现有类中, 而 无需扩展或包装该类。 例如,以下内容将向 该类 添加一个 sortStringChars 函数 String :

有趣的 字串。sortStringChars():String {
    val  chars  =  这个。toCharArray()
    数组。排序(字符)
    return  String(chars)
}

fun  main(args:Array < String >){
    "azbso"。sortStringChars()//返回"abosz"
}


这导致语法更易读 - 但要注意。 强大的力量带来了 巨大的责任 。

功能编程

Kotlin完全支持lambda表达式。 有限的Java 8支持刚刚 添加到Android中 ,这使得Kotlin的功能编程功能特别受欢迎。

//为名称以"J"开头的所有作者筛选一个列表
val  input  =  listOf("JK罗琳","查尔斯达尔文")
val  authors  =  输入。过滤器 { 作者 - >  作者。startsWith("J")}
println(作者)// JK罗琳


也可以 在Collections上 使用诸如 filter 和 map 直接 构造 ,这在大多数Android设备上目前都不支持。

fun  main(args:Array < String >){
    val  input  =  listOf("JK罗琳","查尔斯达尔文","")
    val  authors  =  输入。过滤 { !它。isEmpty()} //删除空值
            。map { Author(it)} //将字符串映射到作者对象
            。sortedBy { it。name } //按作者名排序

    println(authors)//按字母顺序打印作者
}


Reactive Streams最近在Android世界中流行起来, RxKotlin 库 也为Kotlin提供了支持 。

val  cereals  =  listOf("Kellogs Coroutines","Cocoa Pods","Locky Charms")

谷物。toObservable()

    //在后台线程上执行一些密集/复杂的计算

    。subscribeBy(onNext  = {
       println(it)//观察主线上的每个谷物并打印出来
    })


Kotlin Native和Javascript

Kotlin主要针对JVM,但也可以 使用LLVM工具链 转换为Javascript 或编译为本机代码。 这两个目标在开发阶段还处于初期阶段,但对于希望在整个堆栈中使用一种语言进行编程的人来说,这显示了很大的希望。

Kotlin Native特别有趣,因为Swift 看起来与Kotlin非常相似 ,这意味着有朝一日可能会在Android和iOS应用程序中使用相同的本机代码库。

另一个值得一提的是 Gradle Script Kotlin ,它将静态类型的所有好处带到现有的Gradle DSL和 Spring Boot ,后者为Kotlin提供官方支持 1.5 。

潜在的下行

那么Kotlin的缺点是什么?

在Android上,应用程序大小是一个潜在的问题。 Kotlin目前 为您的应用程序大小 增加了大约 1Mb, 并使用了大约7,000种方法,尽管其中大部分都可以被 Proguard 剥离 。 对于传统的Java桌面应用程序来说,这不是什么大不了的事,但对于拥有更多资源限制的移动设备,这对某些团队来说可能是一个交易破坏者。

Kotlin并没有和Java一样长,因此,识别不良做法和代码味道要困难得多。 Java有22年的良好实践和linting工具可供借鉴,而Kotlin却没有。 例如,扩展函数是一个非常强大的功能,但可以轻松地用于应该使用类和抽象的地方。

更人性化的因素是尽管Kotlin与Java非常相似; 学习一门新语言总会有一段时间,这会导致生产力暂时下降。

特别是如果团队中的每个人都在过去十年中成为Java专家,他们可能不愿意放弃并以他们不熟悉的语言重新开始。 外部客户可能对Kotlin感到不太满意,因为有人认为它与Java一样久不存在,并且更为未知。

为什么Kotlin击败Java

让我们总结一下Kotlin的一些主要优点:

  • 科特林是 远远 比Java更简洁

  • Lambdas和功能构造已经开箱即用多年

  • 100%与现有Java代码的互操作性

  • Kotlin实际上消除了最常见的Java错误之一,可怕的 NullPointerException

  • IntelliJ IDEA提供出色的工具支持

  • 这种语言是从头开始编写的,因此,它 感觉 就像是每天都在其中编程的人设计的语言

我们认为,由于这些原因,Kotlin在Android上击败了Java。 在传统的Java桌面应用程序中,由于Java 8包含可比较的语言功能,例如lambda,流和其他,因此它是一个更接近的竞争。 但是,我们仍然相信Kotlin的简洁性在这种情况下获胜。

关于Kotlin入门的建议

在一篇博客文章中总结一下编程语言是不可能的,所以如果你或你的团队有兴趣使用Kotlin,我们的建议只是试一试!

最常见的两条路线是在Kotlin中编写单元测试或将现有的Utils类转换为Kotlin。 IntelliJ IDEA还提供了一个方便的自动转换快捷方式,可将现有Java代码迁移到Kotlin。 虽然这不一定会给你最惯用的Kotlin,但它是一种在你熟悉的代码库中学习语法的好方法。

最重要的是不断评估每个人是否对Kotlin的采用水平感到满意,并确定任何痛点或隐藏的陷阱。

Kotlin是Java的一个非常好的替代品,如果做得好,它有可能提高开发人员的快乐,降低代码库的复杂性,并提高业务的生产力。


代码 作者 功能 语言 方法 程序 类型 支持 字符 用户 简洁 地址 字段 开发 人员 字符串 对象 年龄 应用程序 长度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 互联网科技工作委员会 互联网的科技 嘟嘟瓜互联网科技 壹账通互联网科技 北京禾田雨橡互联网科技 互联网科技公司有哪些 佰商互联网科技有限公司 茂名市互联网科技产业园 苏州五指互联网络科技有限 崇明区互联网教育科技售后服务 民营互联网公司国防科技 允成互联网科技有限公司融资 乌鲁木齐新华智原互联网科技学校 互联网公司黑科技创始人 佛山市翊博互联网络科技有限公司 西安小鹰速贷互联网科技有限公司 卓翼科技产业互联网合作 上海科技产业互联网平台 扫呗互联网科技有限公司 保险科技 互联网保险 科技制造互联网公司 深圳互联网络科技有限公司 广州凡科互联网科技 科技大学互联网专业好不好 中盈科技互联网信息有限公司 天速互联网络科技有限公司 随着互联网科技发展 广州新华互联网科技学校电竞方面 众安科技工业互联网合作
0