收集了一些常见的Kotlin用法
1. 创建数据类
data class Customer(val name: String, val email: String){
}
通常我们会创建一些只用来保存数据的类,比如获取服务器传来的JSON
数据后,将它转换保存为一个对应的数据实体。这样的数据实体类在Kotlin
中可称为data类
,并用data
关键字来标注它,如上。
data类
的构造函数可以直接写在类名后面,这个构造函数称为主构造函数
。在主构造函数中声明属性时,必须在前面添加var
或val
关键字。编译器会自动根据主构造函数中声明的属性添加toString
、copy
、equals
等方法。
ps:data类
中可以有次构造函数,属性也可以和Java一样在类里面声明,但是这些属性会被toString
、copy
、equals
等方法忽略。这里先不用深究,只要知道有data类
就行。
2. 给函数的参数添加默认值
fun foo(a: Int = 0, b: String = "") { ... }
给参数添加默认值后,调用这个函数时,可以选择性地传参,或者不传。如下:
foo() //不传参
foo(b = "123") //只传其中一个参数
foo(a = 2)
3. 过滤列表
比如现在有一个整数列表myList
,我希望把该列表中所有正整数拿出来单独作为一个正整数列表positiveList
,操作方法如下:
var myList = listOf(1, 2, -1, -2, 3, 5)
var positiveList = myList.filter { it > 0 }
将positiveList
打印出来,结果如下:
[1, 2, 3, 5]
4. 遍历map
for ((k, v) in map) {
println("$k -> $v")
}
这里的k
和v
并不是关键字,可以用任何名字代替。
一个小例子:
var map = mutableMapOf<Int, String>()
map[0] = "crx"
map[1] = "haha"
map[4] = "eee"
for ((x, y) in map){
println("key = $x, value = $y")
}
打印出来的结果如下:
key = 0, value = crx
key = 1, value = haha
key = 4, value = eee
5. range常见操作
for (i in 1..100) { ... } // 闭区间,包含100
for (i in 1 until 100) { ... } // 半闭半开区间,不包含100
for (x in 2..10 step 2) { ... }// step 2 表示一次跳2步,x将取 2,4,6,8,10
for (x in 10 downTo 1) { ... } //从 10 到 1
if (x in 1..10) { ... } // 从 1 到 10
6. 只读list和map
生成只读list
val list = listOf("a", "b", "c")
生成只读map
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
既然是只读,意味着初始化之后就不能再修改。
读取上面的map
map["a"]
的值就是 1
7. Lazy 属性
val name: String by lazy{
//属性name需要用到时才初始化
"crx"
}
在变量后面添加关键字by lazy
为变量添加lazy
特性。具有lazy
特性的变量会在第一次被调用时初始化。注意:by lazy
关键字只能用来修饰只读变量。
举一个andorid
初始化控件的例子
class MainActivity : AppCompatActivity() {
private val messageView : TextView by lazy {
findViewById(R.id.message_view) as TextView
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
fun onSayHello() {
// Initialization would be run at here!!
messageView.text = "Hello"
}
}
上面的messageView
在方法onSayHello
被调用时才初始化,类似于懒加载。
8. 扩展方法
fun String.spaceToCamelCase(){
var camelTest = this.split(" ")
.map { it.replaceFirst(it[0], it[0].toUpperCase()) }
.joinToString("")
println(camelTest)
}
上面的方法用来将一个句子转换为驼峰字符串并打印出来。这种写法相当于为String
类扩展了一个方法spaceToCamelCase
,可以这样调用:
//直接调用
"space to camel case".spaceToCamelCase()
//或者
var sentence = "space to camel case"
sentence.spaceToCamelCase()
9. 创建一个单例
object MySingleton{
fun printSomething(str: String){
println(str)
}
}
上面就是一个单例类MySingleton
,用object关键字来修饰就行,这种单例相当于单例中的饿汉模式,至于单例的其它写法,这里暂时不深入,毕竟这里还是kotlin
学习的起始篇(其实是因为我还不知道怎么写)。上面的单例类调用方式如下:
MySingleton.printSomething("test print")
10. 获取可空集合的第一个item
val emails = ... // might be empty
val mainEmail = emails.firstOrNull() ?: ""
没什么特别的,就是调用集合的firstOrNull
方法,如果不为空,则取第一个item
的值,如果为空,则取值""
。
11. 如果不为空则执行
val value = ...
value?.let {
... // 如果value不为空,执行括号中的代码块
}
这里有一个let
关键字,具体作用暂不讲。
12. 有返回值的 when / try-catch / if 表达式
when表达式
fun transform(color: String): Int {
return when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
}
try-catch表达式
fun test() {
val result = try {
count()
} catch (e: ArithmeticException) {
throw IllegalStateException(e)
}
// Working with result
}
if 表达式
fun foo(param: Int) {
val result = if (param == 1) {
"one"
} else if (param == 2) {
"two"
} else {
"three"
}
}
以上这些都是kotlin的惯用写法,记住就行了。
我是使用
kotlin
的 官方文档 来学习的,目前这篇来源于其中Getting Started
章的第二节,我不是一味地翻译其中的内容,也有自己的理解。源篇中有些内容这里没有体现出来,一是因为有些内容和上一篇 Kotlin学习之起始篇—基础语法 重复了,还有些是因为内容较难理解,我认为不应该放进 起始篇,所以就去除了。如果想了解更多,不妨直接看官方文档。
刚接触kotlin
不久,难免有理解错误的地方,请见谅。