take是从集合中取前几个元素 takeLast是从集合中取后几个元素 sortedBy 排序 过滤list,符合过滤条件的就是过滤结果 filterNot把符合条件的过滤掉,剩下的是结果。这个操作和 filter 相反 slice,取集合中的某一部分
val numbers = listOf("one", "two", "three", "four", "five", "six") println(numbers.slice(1..3)) println(numbers.slice(0..4 step 2)) println(numbers.slice(setOf(3, 5, 0))) [two, three, four] [one, three, five] [four, six, one] val numbers = listOf("one", "two", "three", "four", "five", "six") println(numbers.takeWhile { !it.startsWith('f') }) println(numbers.takeLastWhile { it != "three" }) println(numbers.dropWhile { it.length == 3 }) println(numbers.dropLastWhile { it.contains('i') }) [one, two, three] [four, five, six] [three, four, five, six] [one, two, three, four]扩展函数(类似于工具类) fun toast(message: String, length: Int = Toast.LENGTH_SHORT) { Toast.makeText(this, message, length).show() } toast("hello") //扩展函数,我们就可以在每一个Activity中直接使用toast()函数了。 fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(this, message, duration).show() }!! 强⾏行行调⽤用符 ?. 安全调⽤用符
kotlin默认不能空,变量类型后面跟?号定义,表明这是一个可空类型?. 代表着如果该类型为空的话就返回null不做后续的操作,如果不为空的话才会去访问对应的方法或者属性!!. 代表着如果该类型为空的话就抛出NullPointerException,如果不为空就去访问对应的方法或者属性, 所以只有在很少的特定场景才用这种符号,代表着程序不处理这种异常的case了,会像java代码一样抛出NullPointerException。 而且代码中一定不用出现下面这种代码,会让代码可读性很差而且如果有空指针异常,我们也不能马上发现是哪空了: /* * 不推荐这样的写法:链式的连续用!!. * */ val user = User() user!!.name!!.subSequence(0,5)!!.length在 Kotlin 中创建单例不用像 Java 中那么复杂,只需要把 class 换成 object 就可以了。
object Sample { val name = "A name"} //饿汉式的单例,并且实现了线程安全 object A { val number: Int = 1 、 fun method() { println("A.method()") } }companion 可以理解为伴随、伴生,表示修饰的对象和外部类绑定。类似静态变量 写在顶级的函数(不需要在class里写方法)或者变量有个好处:在 Android Studio 中写代码时,IDE 很容易根据你写的函数前几个字母自动联想出相应的函数。这样提高了写代码的效率,而且可以减少项目中的重复代码。 如果想写工具类的功能,直接创建文件,写 top-level「顶层」函数。
创建数组,增加很多有用的工具函数 contains()first()find()
val strs: Array<String> = arrayOf("a", "b", "c")循环通过标准函数 repeat()
repeat(100) { // todo }map也可以这样创建
val map = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 3)listOf() 创建不可变的 List,mutableListOf() 创建可变的 List
Kotlin 中集合分为两种类型:只读的和可变的。这里的只读有两层意思: 集合的 size 不可变 集合中的元素值不可变 可以转换
map.toMutableMap()构造器
class User constructor(var name: String) { // 直接调用主构造器 constructor(name: String, id: Int) : this(name) { } // 通过上一个次构造器,间接调用主构造器 constructor(name: String, id: Int, age: Int) : this(name, id) { } }forEach:遍历每一个元素 filter:对每个元素进行过滤操作,如果 lambda 表达式中的条件成立则留下该元素,否则剔除,最终生成新的集合 map:遍历每个元素并执行给定表达式,最终形成新的集合 flatMap:遍历每个元素,并为每个元素创建新的集合,最后合并到一个集合中
Elvis 操作符 通过 ?: 的操作来简化 if null 的操作
fun validate(user: User) { val id = user.id ?: return // 验证 user.id 是否为空,为空时 return } // 等同于 fun validate(user: User) { if (user.id == null) { return } val id = user.id }== :可以对基本数据类型以及 String 等类型进行内容比较,相当于 Java 中的 equals === :对引用的内存地址进行比较,相当于 Java 中的 ==
如果每个类型都去实现诸如 TextViewList、ActivityList 这样的具体的类型,显然是不可能的。因此就诞生了「泛型」,它的意思是把具体的类型泛化,编码的时候用符号来指代类型,在使用的时候,再确定它的类型
使用关键字 out 来支持协变,等同于 Java 中的上界通配符 ? extends。 使用关键字 in 来支持逆变,等同于 Java 中的下界通配符 ? super。
var textViews: List<out TextView> var textViews: List<in TextView>Kotlin 标准函数 使⽤用时可以通过简单的规则作出一些判断
返回⾃自身 从 apply 和 also 中选 作⽤域中使⽤ this 作为参数选择 apply 作⽤域中使⽤ it 作为参数选择 also不需要返回⾃自身 从 run 和 let 中选择 作用域中使用 this 作为参数,选择 run 作用域中使用 it 作为参数,选择 letapply 适合对一个对象做附加操作的时候 let 适合配合空判断的时候 with 适合对同一个对象进行多次操作的时候
协程就是kotlin官方提供的线程api
属性委托 有些常见的属性操作,我们可以通过委托方式,让它实现,例如:lazy 延迟属性: 值只在第一次访问的时候计算 类委托 可以通过类委托来减少 extend类委托的时,编译器回优使用自身重新函数,而不是委托对象的函数
interface Base{ fun print() } case BaseImpl(var x: Int):Base{ override fun print(){ print(x) } } // Derived 的 print 实现会通过构造函数的b对象来完成class Derived(b: base): Base by b委托就是代理
//接口代理,可以不是必须实现接口或抽象类的方法 class SeniorManager(val driver: Driver, val writer: Writer) : Driver by driver, Writer by writer class CarDriver : Driver { override fun drive() { println("开车呢") } } class PPTWriter : Writer { override fun write() { println("做PPT呢") } } interface Driver { fun drive() } interface Writer { fun write() } val driver = CarDriver() val writer = PPTWriter() val seniorManager = SeniorManager(driver, writer) seniorManager.drive() seniorManager.write() //类委托 interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { print(x) } } class Derived(b: Base) : Base by b//实现继承的代替方式 fun main(args: Array<String>) { val b = BaseImpl(10) Derived(b).print() // prints 10 }使用 类名::class 获取的是 Kotlin 的类型是 KClass 使用 类名::class.java 获取的是 Java 的类型 Any Kotlin 的顶层父类是 Any ,对应 Java 当中的 Object ,但是比 Object 少了 wait()/notify()等函数 Unit Kotlin 中的 Unit 对应 Java 中的 void 在 Java 中通过 「类名.this」 获取目标类引用 在 Kotlin 中通过「this@类名」获取目标类引用
---来自腾讯云社区的---六月的雨
微信扫一扫打赏
支付宝扫一扫打赏