为什么要用Kotlin,和Java完全兼容,相互之间引用完全不是问题,所有没有什么负担。
使用Kotlin已经近一个月,基本上看完了语法就上正式项目了,期间几次准备放弃,最终坚持下来了。关于Kotlin的优点,不必多说了,基于这一个月的经验,来说说Kotlin的入门和坑。

配置工程

添加依赖

作为一个Android码农,使用Kotlin很简单,首先在Android Studio中安装Kotlin插件,在Browse repositories中搜索Kotlin,安装人数最多的那个就是。
安装完成之后,连续按4下shift键,输入config kotlin 进行搜索,选择Config Kotlin in Project,选择Android Gradle,选择app module,工程就配置完成。

转换Java到Kotlin

连续按4下shift键,输入Convert Java Files 进行搜索,选择Convert Java Files to Kotlin Files,可以自动将Java转换为Kotlin

入门

变量声明

  • var 可变变量
  • val 不可变变量

声明变量的格式

var str: String

Kotlin不允许声明变量但不初始化,以String为例,以下三种初始化方式

赋非空值

var str: String = ""

设为null

var str: String? = null

强制设为null

var str: String = null!!

Kotlin是空安全的,但是第三种是例外情况,如果给一个变量赋值为null!!,那么就等于声明这个变量不是空安全的,就算这样使用

var str:String = null!!
str.length

编译器也不会报错

第一种方式,赋值之后不能将str设为null或其他String?的值,否则编译器会报错,第二种方式,每次使用时必须要进行检查,直接使用的话编译器会报错,这样就保证了空安全。举个例子:

var str: String = ""
// str 不是空的,可以直接使用不必检查是否为空
// 可以随意给str赋非空值
str = "hello kotlin"

// 这样编译器是会报错的
str = null

// 如果强制设为null,str就不再是空安全的,编译也就不会检查str了
str = null!!

// 声明str2为可空的变量,str2也是空安全的
var str2: String? = null

// 直接使用str2编译器会报错
str2.length
// 可以这样用
str2?.let {
    log(str2)
}

// str2赋值给str也会报错

最后达到的目的就是,使用一个空变量会报错,使用一个可能为空的变量不检查也会报错,如果觉的检查是否为空太麻烦了,Kotlin支持

if (result?.data?.item?.name != null) {
    log(result?.data?.item?.name)
}

lamda

神奇的it

Kotlin的lamda表达式很简洁,设置OnClickListener

textView.setOnClickListener {
    view -> openActivity(view.context)
}

只有一个参数的时候,是可以隐藏的,用it

textView.setOnClickListener {
    openActivity(it.context)
}

多个参数的时候

checkbox.setOnCheckedChangeListener { compoundButton, b ->
}

Kotlin的函数可以作为参数,写callback的时候,可以不用interface了

// 声明一个callback
var callback: (()->Unit)? = null
// 判断并使用
callback?.invoke()

// 想带参数
var callback: ((str: String)->Unit)? = null
// 判断并使用
callback?.invoke(str)

// set callback
item.callback = {
    // do something
}
// 带参数的callback
item.callback = {
    doSomething(it)
}

遇到的坑

Databinding

需要在app moudle的build.gradle里面添加

kapt {
    generateStubs = true
}
dependencies {
    kapt 'com.android.databinding:compiler:2.2.0-rc2'
}

2.2.0-rc2 这个版本号必须要和根目录下的build.gradle文件内的com.android.tools.build:gradle:2.2.0-rc2 版本号一致

Dagger2

官方博客说是支持Dagger2的,但实际遇到的情况是和Databinding结合使用有问题

奇怪的报错

使用Databinding,设置ViewModel时

cannot access class '...'. check your module classpath for missing or conflicting dependencies

应该是Kotlin的bug,只是报错,不影响编译,如果不希望提示错误,可以添加
@Suppress("MISSING_DEPENDENCY_CLASS")

编译的时候报找不到class的问题,clean一下就好,不知道什么原因

不知道代码怎么写

Java的代码提示很方便,setListener,基本只用输入new,按代码提示回车就自动完成了,匿名函数应该怎么写呢

 textView.setOnClickListener(object: View.OnClickListener {
            override fun onClick(v: View?) {
            }
})

静态变量应该怎么写呢

class A {
    companion object {
        val TAG = "classA"
    }
}

// 在Java代码中使用
A.Companion.getTAG()

怎么从Kotlin转为Java

两种方法

  • 打包,输出apk,使用dex2jar将apk代码文件提取成jar,使用jd-jui查看,将对应的代码拷贝出来,修改,使用
  • 把Kotlin文件删掉,用Java重写一遍

Kotlin从入门到掉坑里的更多相关文章

  1. Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务

    本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...

  2. Docker从入门到掉坑(三):容器太多,操作好麻烦

    前边的两篇文章里面,我们讲解了基于docker来部署基础的SpringBoot容器,如果阅读本文之前没有相关基础的话,可以回看之前的教程. Docker 从入门到掉坑 Docker从入门到掉坑(二): ...

  3. Docker从入门到掉坑(四):上手k8s避坑指南

    在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作,在接下来的这篇文章开始,我们将开始进入对于k8s模块的学习 不熟悉的可以先回顾之前的章节,Docker教程系列文章将归 ...

  4. Docker 从入门到掉坑

    Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器.但是docker本身和虚拟机还是有较为明显的出入的.我大致归纳了一下,可以总结为以下几点: docker自身也有 ...

  5. springboot + rabbitmq 用了消息确认机制,感觉掉坑里了

    本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步 最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI ...

  6. Docker从入门到掉坑(五):继续挖一挖 k8s

    在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作及k8s上手避坑,在接下来的这篇文章开始,我们将继续对k8s模块的学习 pod是啥 在k8s里面,有很多新的技术概念,其 ...

  7. 【python】疯了,掉坑里出不来了

    学软件最头疼的事情就是版本换来换去: 各种配置错误,疯了,疯了--

  8. nginx 跨域。。。掉坑里了,小心

    今天公司产品一个功能突然挂掉了...向客户演示之前出现了,手机端显示不能获取下载资源,可是急坏了一票人.. 通过手机端,调查服务器地址调用了http:/2342342.domain.hostname. ...

  9. HR别掉坑里了,送你最精确的计薪算法!

      月工资的计算方式有多种多样.即便是资深的HR,也会犯常识性的错误,正算反算,哪一个方法更适合,有时还会容易出现数字偏差,回想一下,你们公司的工资是如何计算的? 第一 劳动工资计算标准按几天计算 根 ...

随机推荐

  1. 主成分分析(PCA)的一种直观理解

    源自知乎的一个答案,网上很多关于PCA的文章,不过很多都只讲到了如何理解方差的投影,却很少有讲到为什么特征向量就是投影方向.本文从形象角度谈一谈,因为没有证明,所以不会严谨,但是应该能够帮助形象理解P ...

  2. 解决The file “FWLifeApp” couldn’t be opened because you don’t have permission to view it.问题

    The file “FWLifeApp” couldn’t be opened because you don’t have permission to view it问题是因为项目文件中的Bundl ...

  3. LeetCode - Populating Next Right Pointers in Each Node II

    题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...

  4. MySql LAST_INSERT_ID 【插入多条数据时】

    LAST_INSERT_ID 自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值. 参考这里 The ID that was generat ...

  5. Oracle Error - "OCIEnvCreate failed with return code -1 but error message text was not available".

    ISSUE: When trying to connect to an Oracle database you receive the following error: "OCIEnvCre ...

  6. 炉石传说 C# 开发笔记(BS上线尝试)

    昨天买了一个月的1G 1核的服务器,由于不是新用户,所以没有享受到阿里的6个月免费的优惠. (阿里脑残,为什么不对于续费或者升级免费呢?) 在服务器的通讯上面已经OK了,完全绕过了ASP.NET,就是 ...

  7. C# 模拟登陆并继续访问其他页面

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net;usi ...

  8. LeetCode5:Longest Palindromic Substring

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  9. Oracle数据库,内置函数小结

    1.聚合函数 count(字段) // 求非空行的数量 max(字段) // 获取最大值 sum(字段) //求和 avg(字段) // 平均值 min(字段) // 最小值 2.转换函数 to_da ...

  10. Scalaz(54)- scalaz-stream: 函数式多线程编程模式-Free Streaming Programming Model

    长久以来,函数式编程模式都被认为是一种学术研究用或教学实验用的编程模式.直到近几年由于大数据和多核CPU的兴起造成了函数式编程模式在一些实际大型应用中的出现,这才逐渐改变了人们对函数式编程无用论的观点 ...