Kotlin 基础精华篇
Kotlin 内联函数let、with、run、apply、also
Kotlin 协程学习总结
一、类的几种类型
外部类类类型 | 能否被继承或实现 | 能否有构造方法 |
---|---|---|
class | 否 | 是 |
open class | 是 | 是 |
abstract class | 是 | 是 |
object | 否 | 是 |
enum class | 否 | 是 |
interface | 是 | 否 |
内部类类型 | 是否可定义多个 | 是否单例 | 是否静态内部类 |
---|---|---|---|
class | 是 | 否 | 是 |
inner class | 是 | 否 | 否 |
object | 是 | 是 | 是 |
companion object | 否 | 是 | 是 |
二、一些常用函数
1、通过求和来看看函数的几种方式
private fun sum(a: Int, b: Int): Int {
return a + b
}
private val sum1: (Int, Int) -> Int = { a, b -> a + b }
private fun sum2(a: Int, b: Int) = a + b
// vararg 可变参数 ;sum() 为kotlin提供的函数,其实就是for循环求和
private fun sum3(vararg numbers: Int) = numbers.sum()
// sumBy 支持对原始数据进行加工
private fun sum4(vararg numbers: Int) = numbers.sumBy { it * 2 }
运行结果:
println("sum result is ${sum1(1, 5)}")
println("sum result is ${sum1}")
println("sum result is ${sum2(1, 5)}")
println("sum result is ${sum3(1, 2, 3, 4, 5)}")
println("sum result is ${sum3()}")
println("sum result is ${sum4(1, 2, 3, 4, 5)}")
//输出:
sum result is 6
sum result is Function2<java.lang.Integer, java.lang.Integer, java.lang.Integer>
sum result is 6
sum result is 15
sum result is 0
sum result is 30
2. 三目运算符使用 if-else
或 ?:
java ---> return object == null ? "" : object.toString();
kotlin---> return if(any == null) "" else any.toString()
kotlin---> return any?.toString() ?: ""
3.字符串比较使用 ==
>
<
,不必 equals
了
var currentVersion = "v1.0.1"
var lastVersion = "v1.0.1.1"
if (lastVersion == currentVersion) {
println("维持原版本")
} else if (lastVersion > currentVersion) {
println("升级到最新版本")
} else {
println("数据错误")
}
//输出:升级到最新版本
4.类型判断 is
!is
(相当于java的 instanceof
),类型明确则可自动进行类型转换
private fun anyLength(any: Any?): Int {
return when (any) {
is String -> {
//any 自动类型转换为 String,不必 (any as String).length
any.length
}
is List<*> -> {
//any 自动类型转换为 List
any.size
}
is UserInfo -> {
//any 自动类型转换为 UserInfo
any.id.toInt()
}
!is Set<*> -> {
-1
}
else -> 0
}
}
5.区间判断 in
!in
for-in-..
是闭区间,如for(i in 0..10)
中i取值范围是[0,10] (即0 <= i <= 10)
for-in-until
是左闭右开,如for(i in 0 until 10)
中i取值范围是[0,10) (即0 <= i < 10)
所以遍历List切勿 for(i in 0..list.size)
哦
downTo
倒序遍历
step
设置遍历步长
val list = ArrayList<String>()
val start = 'a'.toInt()
for (i in start..start + 10) {
//添加11个元素到列表
list.add(i.toChar().toString())
}
//List全量遍历
for (str in list) {
print("$str, ") //输出:a, b, c, d, e, f, g, h, i, j, k,
}
//List全量遍历
list.forEach {
print("$it, ") //输出:a, b, c, d, e, f, g, h, i, j, k,
}
println()
println("a" !in list) //输出:false
println("d" in list) //输出:true
println("z" in list) //输出:false
//遍历步长
for (i in 0 until list.size step 2) {
print("${list[i]}, ") //输出: a, c, e, g, i, k,
}
println()
//倒序遍历
for (i in list.size - 1 downTo 0 step 3) {
print("${list[i]}, ") //输出: k, h, e, b,
}
6.常用集合操作
subList
截取
filter
过滤
sortedBy
根据某元素正序
sortedByDescending
根据某元素倒序
map
转换
forEach
遍历
list.subList(2, 8) //输出:c, d, e, f, g, h,
.filter { it[0].toInt() < 'a'.toInt() + 5 } //输出:c, d, e,
.sortedBy { it[0].toInt() } //输出:c, d, e,
.sortedByDescending { it } //输出:e, d, c,
.map { it.toUpperCase(Locale.ROOT) } //输出:E, D, C,
.forEach { print("$it, ") }
7.自定义函数支持lambda
// 通常写法,不支持lambda
fun setOnViewClickListener(listener: OnViewClickListener) {
this.onViewClickListener = listener
}
// 支持lambda
fun setOnViewClickListener(action: (View, Int) -> Unit) {
this.onViewClickListener = object : OnViewClickListener {
override fun onViewClick(view: View, type: Int) {
action(view, type)
}
}
}
// 自定义回调
interface OnViewClickListener {
fun onViewClick(view: View, type: Int)
}
调用:
setOnViewClickListener(object : OnViewClickListener {
override fun onViewClick(view: View, type: Int) {
//TODO
}
})
//简写
setOnViewClickListener { view, i ->
//TODO
}
未完待续
网友评论