Android谷歌官方语言Kotlin用法入门教程
2017-05-19 11:59
751 查看
为什么使用Kotlin
因为Kotlin语法与Java的区别挺大的一开始很想放弃,如果不是谷歌让其成为Android的官方开发语言,想必很少人会尝试这样一门小众语言,但是换了Kotlin后会发现这些年究竟浪费多少时间在写无用的Java代码了,Kotlin在兼容Java的基础上还大大提升效率。Kotlin有许多特性但对于初学者来说,快速适应和学习更为重要!很多时候我们都是在不明白其原因就开始使用的,正如我们不可能把Retrofit、RxJava、OKHttp原理研究透才使用它。目前使用Kotlin的主要原因是因为它语法简洁,支持lambda表达式,强大的when语法,不用写分号结尾,光是这些就足以让我们喜欢上Kotlin。还有些空安全之类的特性,服务端数据类型太多null了。突然一脸懵逼地看着Kotlin火了,GoogleIO的对开发者的影响真是不容小觑。在此也就把上一篇Kotlin基础文章的知识也搬迁过来,稍作修改。
创建一个Kotlin项目
首先,得把你的IDE-As保证是:Android Studio 3.0以上新版本。Android Studio中文社区(官网) -Android App开发工具集
1、勾选:include Kotlin support 点击finish完成。
2、创建好的Activity中便已经是Kotlin的代码,看起来与Java代码本身非常相似:Kotlin文件以.kt结尾。
使用Kotlin声明Activity:
class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity) } }1
2
3
4
5
6
1
2
3
4
5
6
使用Kotlin设置点击事件:
val textView = findViewById(R.id.text) as TextView textView.setOnClickListener { Toast.makeText(this,"Hello Kotlin!",Toast.LENGTH_SHORT).show() }1
2
3
4
5
6
1
2
3
4
5
6
小结:上面的setContentView以及下面的Toast就是Android提供的API,我们可以直接使用了,并且setOnClickListener方法内部并不需要new OnClickListener对象!直接写点击实现就可以了!还有Toast的第一个参数this在Java中是一定要写Activity.this的,而这里只用写this就可以了!
3、Kotlin文件目录:默认创建好的Kotlin文件还是会放在和Java文件一样的位置,如果需要使kotlin文件与Java文件分开放的话,
那么可以在对应的gradle文件中加入以下配置:这样的话,所有默认创建的Kotlin文件就会被放在/kotlin/目录下了。
android { sourceSets { main.java.srcDirs += 'src/main/kotlin' } }
4、文件转换:将java代码的,通过 Code/Conver Java File to Kotlin File 转换成 Kotlin代码。另外,将Java代码直接复制到Kotlin文件里会提示,选择转换即可,也是非常方便的。
Kotlin 语法
下面会说一些学习 Kotlin 常见语法,其实和Java代码语法非常相似,比较差异很容易就能理解了,一开始难免不适应,等习惯后,相信你一定会喜欢上Kotlin语法的。1). 声明定义
忘掉Java的那一套写法不然会很不适应的,Kotlin有自己的特性不该被Java的思维所束缚。在Kotlin中常量用val声明,变了用var声明,关键字在前面,类型以冒号:隔开在后面,也可以省略直接赋值,类型后带问号?表示可为空类型(默认空安全)。
常量val延迟加载by lazy{},默认线程安全关闭线程安全lazy(LazyThreadSafetyMode.NONE){},变量var延迟加载lateinit。
//常量数组int[][][] arrs = new int[3][2][1];
val arrs = Array(3) { Array(2) { IntArray(1) } }
//空安全变量
var str: String = "hello"
//可为空字符串变量
var str1: String? = null
2). 条件
if...else 正常使用,不过移除了switch用更强大的when替代,when子式可以是各种返回Boolean的表达式。
val x = 7
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
3). 循环
while 和 do...while 同Java并无区别,for则有很大改变并多出了几个变种。
val list = ArrayList<String>()
//递增for (int i = 0; i < list.size(); i++)
for (i in list.indices) {
print(list[i])
}
//递增for (int i = 2; i < list.size(); i++)
for (i in 2..list.size-1) {
print(list[i])
}
//递减for (int i = list.size(); i >= 0; i--)
for (i in list.size downTo 0) {
print(list[i])
}
//操作列表内的对象
for (item in list) {
print(item)
}
//加强版
for((i, item) in list.witnIndex()) {
print(list[i])
print(item)
}
//变种版
list.forEach {
print(it)
}
list.forEach {
print(it)
}
list.forEachIndexed { i, s ->
print(list[i])
print(s)
}
list.forEachIndexed(object :(Int,String) -> Unit{
override fun invoke(i: Int, s: String) {
print(list[i])
print(s)
}
})
万能的冒号
在Kotlin中':'冒号绝对是万能来称呼都不为过。常量变量的类型声明、函数的返回值、类的继承都需要它。//val表示常量var表示变量声明
val name: String = "tutu"
//省略类型说明
var age = "23"
//fun表示函数
fun getName(): String{
return "tutu"
}
//类继承
class UserList<E>(): ArrayList<E>() {
//...
}
除此之外还有一个特别的地方也需要它,使用Java类的时候。Kotlin最终会还是编译成Java字节码,使用到Java类是必然的,在Kotlin语法如下。
val intent = Intent(this, MainActivity::class.java)
类名 ::class.java 没有为什么就这么写记着就是
我是谁的@
除了冒号另一个重要符号 @,想必用到内部类和匿名内部类的地方一定很多,再加上支持 lambda 语法,没有它谁告诉你this和return指的是哪一个。class User {
inner class State{
fun getUser(): User{
//返回User
return this@User
}
fun getState(): State{
//返回State
return this@State
}
}
}
偷懒的方法
1). Kotlin特色Java的getter/setter方法自动转换成属性,对应到Kotlin属性的调用。
public class User {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
这样一个Java类在Kotlin中只需这样调用。
val user = User()
//赋值
user.name = "tutu"
user.age = "23"
//取值
val name = user.name
val age = user.age
反之Kotlin的属性自动生成Java的 getter/setter 方法,方便在Java中调用,同样的定义在Kotlin中。
class User {
var name: String? = null
var age: String? = null
}
我们的 getter/setter 方法有时不会这么简单,这就需要自定义 getter/setter 了,另起一行设置 get()/set(value) 方法,实现一个Java中常用的单例,这里只为了展示,单例在Kotlin有更简单的方法实现,只要在 package 级别创建一个 object 即可。
class User {
companion object {
@Volatile var instance: User? = null
get() {
if (field == null) {
synchronized(User::class.java) {
if (field == null)
field = User()
}
}
return field
}
}
var name: String? = null
var age: String? = null
}
自定义getter/setter重点在field,跟我们熟悉所Java的this指代当前类一样,field指代当前参数,直接使用参数名instance代替不会报错但单例就没效果了
2). 字符串模板
在Java中拼接字符串的代码可读性都很差,在Kotlin字符串拼接变得非常简洁,只需用
$后面加上参数名,复杂的参数要加上
{}
val user = User()
//赋值
user.name = "tutu"
user.age = "23"
//取值
val name = user.name
val age = user.age
var userInfo = "name:${user.name}, age:$age"
//输出结果:name:tutu, age:23
3). lambda
一开始觉得lambda很高级完全看不懂,其实很简单的就是把接口名、方法名和参数类型省掉不写再加个 -> 罢了,明白这点了就不介绍。
空判断
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式一种像Java一样抛出空异常,字段后加 !!,另一种不做处理直接跳过,字段后加?//类型后面加?表示可为空
var age: String? = "23"
//抛出空指针异常
val ageInt = age!!.toInt()
//不做处理跳过
val ages = age?.toInt()
注意事项
内部类和参数默认为public,而在Java中为private。类默认为不可继承(final),想要可被继承要声明为open或abstract。
取消了static关键字,静态方法和参数统一写在companion object块。
internal模块内可见,inner内部类。
以上仅是对使用频率较高的语法总结,学会基本可以阅读Kotlin代码,遇到点问题Google速查一下,至于智能转换、类型推导之类的不用说使用后喜欢自然就会了。当然这只是kotlin的基本语法,方便Java快速熟悉kotlin,深入学习还请阅读相关资料。
最后,推荐俩个官方学习网站,知识都比较全面:
Kotlin —— 语言中文站。
Kotlin —— 中文文档。
欢迎加入QQ群聊,一起探究学习流行技术,骚客们还等什么!
相关文章推荐
- Android 谷歌官方Kotlin语言入门教程(一)基础语法
- Kotlin---android官方开发语言使用入门
- 详解谷歌官方教程 Android插件ADT 9.0.0
- 详解谷歌官方教程 Android插件ADT“.NET研究” 9.0.0
- Android uiautomator 使用入门官方教程
- Android uiautomator 使用入门官方教程
- Android基础入门教程——2.4.15 DrawerLayout(官方侧滑菜单)的简单使用
- android编写Service入门用法与教程
- HttpClient4.1入门教程-利用官方例子讲解httpClient4.1的用法
- Android基础入门教程——7.5.1 WebView(网页视图)基本用法
- Android官方入门文档[9]支持不同的语言
- Android开发者入门必知了解谷歌官方Android开发文档
- ANDROID 开发:谷歌地图开发入门(3)--- google map api v3 入门教程辅助
- phonegap 开发入门 PhoneGap官方网站上有详细的入门示例教程,这里,我针对使用PhoneGap进行Android移动应用的开发对其官网的Get Started进行一些介绍、补充。 Ste
- Android基础入门教程——7.5.1 WebView(网页视图)基本用法
- 详解谷歌官方教程 Android插件ADT 9.0.0
- ANDROID 开发:谷歌地图开发入门(3)--- google map api v3 入门教程辅助
- android编写Service入门用法与教程
- Android基础入门教程——2.4.15 DrawerLayout(官方侧滑菜单)的简单使用
- Android桌面组件App Widget用法入门教程