初识 Kotlin 的不解

如果不曾早起,可以静观六点的晨光。

  • Kotlin(维基百科)
    Kotlin是一种在Java虚拟机上运行的静态类型编程语言,它也可以被编译成为JavaScript源代码。它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言,其名称来自于圣彼得堡附近的科特林岛。[3]2012年1月,著名期刊《Dr. Dobb’s Journal》中Kotlin被认定为该月的最佳语言。[4]虽然与Java语法并不兼容,但Kotlin被设计成可以和Java代码相互运作,并可以重复使用如Java集合框架等的现有Java类库。Hathibelagal写道,“如果你正在为Android开发寻找一种替代编程语言,那么应该试下Kotlin。它很容易在Android项目中替代Java或者同Java一起使用。”

  • 历史(维基百科)
    2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言,它已被开发一年之久。[5]JetBrains负责人Dmitry Jemerov说,大多数语言没有他们正在寻找的特性,但是Scala除外。但是,他指出Scala的编译时间过慢这一明显缺陷。[5]Kotlin的既定目标之一是像Java一样快速编译。2012年2月,JetBrains以Apache 2许可证开源此项目。[6]
    Jetbrains希望这个新语言能够推动IntelliJ IDEA的销售。[7]
    Kotlin v1.0于2016年2月15日发布。[8]这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性。
    在Google I/O 2017中,Google宣布在Android上为Kotlin提供最佳支持。[9]

  • Kotlin很明显受到Java、C#、JavaScript、Scala、Groovy等语言的影响。例如Kotlin可以直接通过println(“Hello, {name}”)或println(“Hello, $name”)来使用字符串模板,和古老的shell script类似。又如Kotlin中的分号是可选的,这类似JavaScript,而且Groovy、Scala也有同样的能力。Kotlin常量定义关键字是val(不同于变量定义关键字var),表示固定值,这功能来自Scala,Swift也有类似功能。
    需要注意,Kotlin没有关键字new。

  • Kotlin 官网https://kotlinlang.org/
    Kotlin 文档中文版http://www.kotlincn.net/docs/reference/
    Kotlin on GitHubhttps://github.com/JetBrains/kotlin
    Kotlin 学习(推荐,更新于20210303)https://www.wenyingzhi.com/mu-lu
    Kotlin 在线运行https://c.runoob.com/compile/2960

  • Error:This type has a constructor,and thus must be initialized here
    错误:此类型具有构造函数,因此必须在此处初始化。
    我猜你这样写了一个类

      class FirstActivity : AppCompatActivity {}
    

    需要构造函数,这样写

      class FirstActivity : AppCompatActivity() {}   
    
  • 以前总喜欢这样用上下文环境
    private Context mContext;
    或者 private Activity mActivity;
    然后 mContext = this;
    mActivity = this;
    Kotlin 就这样写了
      val instance by lazy { this }//这里使用了委托,表示只有使用到instance才会执行该段代码   
    

    instance 即代表了上下文。
    java中 XXXActivity.class Kotlin中 this@XXXActivity (标签语法)
    &&、在类内部指代自身的this关键字,Java的完整写法是“类名.this”,而Kotlin的完整写法是“this@类名”,当然二者均可简写为“this”;
    &&、获取某个类的class对象,Java的写法是“类名.class”,而Kotlin的写法是“类名::class.java”,一看便知带有浓浓的Java风味;

  • Kotlin activity跳转-startActivity
      startActivity(Intent(this@MainActivity, FirstActivity::class.java))
    

    或者

      startActivity(Intent(this, FirstActivity::class.java))  
    

    传参MainAcvivity

      var intent = Intent(this@MainActivity,FirstActivity::class.java)
          var bundle = Bundle()
      bundle.putString("name","清扬")
      bundle.putInt("age",18)
      intent.putExtras(bundle)
      startActivity(intent)
    

    接收端FirstActivity

      var bundle = intent.extras
      var name = bundle.get("name")
      var age = bundle.get("age")
      Log.i("FirstActivity","name == "+name.toString())
      Log.i("FirstActivity","age == "+age.toString())  
    
  • 控件findViewById
    不使用依赖库,倾向于下面的写法
    private val btn : TextView by lazy{
      findViewById(R.id.btn) as TextView
    }
    -----------------------------------------
    btn.text = "清扬"
    btn.textSize = 22f
    btn.setOnClickListener(){
      Log.i("FirstActivity", "人不轻狂枉少年" )
    }
    

    lazy是Kotlin的属性代理的一个实例,它提供了延迟加载的机制。换句话说,这里的lazy提供了初始化控件的方法,不过真正初始化这个动作发生的时机却是在控件第一次被使用时。lazy默认是线程安全的。

  • Kotlin 中 Float 和 Double 有一个静态变量NaN(不是一个数的数 not a number),并且两个相同的NaN做比较,返回false,(Double.NaN == Double.NaN) == false。

  • 定义闭区间
      // 0到1024的闭区间1,1024]
      val range = 1..1024
    

    定义半开区间

      // 0到1024的闭区间[1,1024)
      val openRange = 1 until 1024
    
  • kotlin 没有 java 的基本数据类型的概念了,所以 == 的含义变成了equals。

  • Kotlin 作为一种独立的编程语言,有一些 Java 中没有的关键字,以下是 Kotlin 特有的一些关键字:
companion:伴生对象,可以在类内部定义一个对象,用于实现静态方法和属性。  

data:数据类,用于快速创建一个用于存储数据的类。  

by:委托,可以在一个对象中使用另一个对象的属性或方法。  

reified:具体化,用于解决 Java 泛型擦除问题。  

inline:内联,用于在编译时将函数代码插入到调用处,提高性能。  

non-local return:非局部返回,可以在嵌套函数中使用 return 关键字返回到外部函数。  

tailrec:尾递归,用于将递归函数改为尾递归函数,提高性能。  

suspend 和 coroutine:协程,Kotlin 支持协程编程,可以使用 suspend 关键字定义挂起函数,使用 coroutine 构建异步和并发程序。  
  • Kotlin 常见内置函数
let:作用于某个对象,让其调用一个函数,并返回 Lambda 表达式的结果。let 函数可以避免在调用 Lambda 表达式时产生多余的变量名,提高了代码可读性。  

apply:作用于某个对象,将对象本身作为接收器(this)返回,可以连续进行多次调用,非常适合链式调用代码块的场景。  

with:非扩展函数,接受一个对象和一个 Lambda 表达式,可以让您在将对象本身作为参数传递的情况下调用 Lambda 表达式。with 函数允许编写更紧凑的代码,特别是当您需要访问一个对象的属性时。  

run:类似于 let 函数,但是只能作用于可空对象。如果对象不为空,run 函数会让对象调用 Lambda 表达式并返回其结果;如果对象为空,run 函数返回 null  

also:类似于 let 函数,但是返回的值是指定的接收器对象,而不是 Lambda 表达式的结果。可以用于在对象的生命周期内执行额外的操作。  

takeIf:接受一个谓词(Lambda 表达式),并返回任何满足该谓词的对象,否则返回 null。  

takeUnless:与 takeIf 函数相反,如果对象不满足指定的谓词,则返回对象本身,否则返回 null。  

when:作为表达式或语句,类似于 Java 中的 switch 语句,可以匹配多个条件或者值,并执行与条件/值对应的代码块。






转载请注明:劉清揚的博客 » 初识 Kotlin 的不解