Kotlin从入门到掉坑里
为什么要用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从入门到掉坑里的更多相关文章
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- Docker从入门到掉坑(三):容器太多,操作好麻烦
前边的两篇文章里面,我们讲解了基于docker来部署基础的SpringBoot容器,如果阅读本文之前没有相关基础的话,可以回看之前的教程. Docker 从入门到掉坑 Docker从入门到掉坑(二): ...
- Docker从入门到掉坑(四):上手k8s避坑指南
在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作,在接下来的这篇文章开始,我们将开始进入对于k8s模块的学习 不熟悉的可以先回顾之前的章节,Docker教程系列文章将归 ...
- Docker 从入门到掉坑
Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器.但是docker本身和虚拟机还是有较为明显的出入的.我大致归纳了一下,可以总结为以下几点: docker自身也有 ...
- springboot + rabbitmq 用了消息确认机制,感觉掉坑里了
本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步 最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI ...
- Docker从入门到掉坑(五):继续挖一挖 k8s
在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作及k8s上手避坑,在接下来的这篇文章开始,我们将继续对k8s模块的学习 pod是啥 在k8s里面,有很多新的技术概念,其 ...
- 【python】疯了,掉坑里出不来了
学软件最头疼的事情就是版本换来换去: 各种配置错误,疯了,疯了--
- nginx 跨域。。。掉坑里了,小心
今天公司产品一个功能突然挂掉了...向客户演示之前出现了,手机端显示不能获取下载资源,可是急坏了一票人.. 通过手机端,调查服务器地址调用了http:/2342342.domain.hostname. ...
- HR别掉坑里了,送你最精确的计薪算法!
月工资的计算方式有多种多样.即便是资深的HR,也会犯常识性的错误,正算反算,哪一个方法更适合,有时还会容易出现数字偏差,回想一下,你们公司的工资是如何计算的? 第一 劳动工资计算标准按几天计算 根 ...
随机推荐
- shell的历史
shell的历史 shell概况 人想要和操作系统进行交互,传送指令给操作系统,就需要使用到shell.宏义的shell是人与机器交互的页面,它分为两种,一种是有界面的,比如GUI,另外一种是没有界面 ...
- 七、L2CAP
1. L2CAP 在BR/EDR模式下,在connection procedure成功执行后,两台设备通过一条物理信道(physical channel)连接在一起,同时两者之间建立起了一条 ...
- 图论 ---- spfa + 链式向前星 ---- poj 3268 : Silver Cow Party
Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12674 Accepted: 5651 ...
- SQL中 将同一个表中的A列更新到B列,B列更新到A列
有网友在SKYPE问及,如标题,SQL中 将同一个表中的A列更新到B列,B列更新到A列. 其实这个不是问题,直接写更新语句即可,可以参考下面动画演示: SQL source code: CREATE ...
- 对TabControl的简单优化
之前由于忙于赶项目进度而忽视了软件的用户体验,界面挺难看,有一天看见组长优化了某个窗体,让人感觉完全不一样,我也不甘示弱,要把我的程序做顺眼一点才行.我的程序是一个以TabControl为主要容器的窗 ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(六)SendReceiveOptions
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- iOS高效开发之Xcode应用插件
前言:本文非原创 文章摘自 www.cocoachina.com/industry/20130918/7022.html 古人云“工欲善其事必先利其器”,打造一个强大的开发环境,是立即提升自身战 ...
- C# WebClient 使用http免费代理。
static void Main(string[] args) { WebClient client = new WebClient(); client.Encoding = Encoding.Get ...
- .NET使用ZXing.NET生成中间带图片的二维码
很久之前就有写这样的代码了,只是一直没记录下来,偶然想写成博客. 把之前的代码封装成函数,以方便理解以及调用. 基于开源的 ZXing.NET 组件,代码如下: 先添加对ZXing.NET的引用,然后 ...
- C#Winform VScrollBar+Pannel自定义列表控件(原)
该控件的主要实现思路是用的objective-c中的自定义控件思路,主视图中放子视图 效果图 (窗体调用代码) public partial class Form1 : RibbonForm { Li ...