-
接口 抽象类 继承
和Java差不多,都是通过 : -
vararg
动态参数,可以传入多个参数。 -
扩展函数
// 假设这个代码是,开源的,或者是很庞大JDK源码,或者是非常复杂的开源库
class KtBase113 (val name: String, val age: Int, val sex: Char)// 增加扩展函数
fun KtBase113.show() {println("我是show函数, name:${name}, age:$age, sex:$sex")
}
- 中缀表达式 infix
// 自定义的中缀表达式 + 扩展函数 一起用的 使用者: "一".gogogo(1) "一" gogogo 1
// 1.条件一 对第一个参数 C1.gogogo 函数扩展
// 2.条件二 需要在 括号(c2: C2) 参数里面,传递一个参数
private infix fun <C1, C2> C1.gogogo(c2: C2) {// 做很多的逻辑// ...// 省略几万行代码println("我们的中缀表达式,对一个参数的内容是:$this")println("我们的中缀表达式,对二个参数的内容是:$c2")
}123 gogogo '男'
- 重命名扩展
// 1.扩展文件一般都是public,如果private外界无法使用
// 2.Iterable<E> 子类 set list 都可以用,所以用父类
// 3.本次扩展函数的作用是,随机取第一个元素返回
fun <E> Iterable<E>.randomItemValue() = this.shuffled().first()
fun <T> Iterable<T>.randomItemValuePrintln() = println(this.shuffled().first())val list : List<String> = listOf("李元霸", "李连杰", "李小龙")
println(list.randomItemValue())import randomItemValue as g // as g 重命名扩展操作
import randomItemValuePrintln as p val list : List<String> = listOf("李元霸", "李连杰", "李小龙")
val set : Set<Double> = setOf(545.5, 434.5, 656.6)
// 使用 扩展文件
println(list.g())
println(set.g())
- 变换函数-map
val list = listOf("李元霸", "李连杰", "李小龙")// T T T ---> 新的集合(R, R, R)// 原理:就是把你 匿名函数 最后一行的返回值 加入一个新的集合,新集合的泛型是R,并且返回新集合val list2 : List<Int> = list.map {// it = T == 元素 == String"【$it】"88}println(list2)
- 变化函数-flatmap
// map {返回类型:T String Int Boolean Char ... 是把每一个元素(String)加入到新集合,最后返回新集合 List<String>}
// flatMap {返回类型:每一个元素 T 集合1 集合2 集合3 ... 是把每一个元素(集合)加入到新集合,最后返回新集合 List<List<String>> 最终内部会处理成List<String>}val list : List<String> = listOf("李四", "王五", "赵六", "初七")val newList : List<String> = list.map {"你的姓名是:$it" // 每次返回一个 String}.map {"$it, 你文字的长度是:${it.length}" // 每次返回一个 String}.flatMap {listOf("$it 在学习C++", "$it 在学习Java", "$it 在学习Kotlin") // 每次返回一个集合,四次}println(newList)println()/*[你的姓名是:李四, 你文字的长度是:8 在学习C++,你的姓名是:李四, 你文字的长度是:8 在学习Java,你的姓名是:李四, 你文字的长度是:8 在学习Kotlin,你的姓名是:王五, 你文字的长度是:8 在学习C++,你的姓名是:王五, 你文字的长度是:8 在学习Java,你的姓名是:王五, 你文字的长度是:8 在学习Kotlin,你的姓名是:赵六, 你文字的长度是:8 在学习C++,你的姓名是:赵六, 你文字的长度是:8 在学习Java,你的姓名是:赵六, 你文字的长度是:8 在学习Kotlin,你的姓名是:初七, 你文字的长度是:8 在学习C++,你的姓名是:初七, 你文字的长度是:8 在学习Java,你的姓名是:初七, 你文字的长度是:8 在学习Kotlin]*/
- 过滤函数-filter
nameLists.flatMap {it -> it.filter {it.contains('黄') // 包含 ‘黄’ true,否则是false}}.map {print("$it ")}
- 合并函数-zip
val names = listOf("张三", "李四", "王五")val ages = listOf(20, 21, 22)// RxJava zip 合并操作符// KT 自带就有zip 合并操作// 原理:就是把 第一个集合 和 第二个集合 合并起来,创建新的集合,并返回// 创建新的集合(元素,元素,元素) 元素Pair(K, V) K代替第一个集合的元素 V代替第二个集合的元素val zip : List<Pair<String, Int>> = names.zip(ages)
-
object
object 申明的是饿汉式式单例对象 -
@file:JvmName
申明Kotlin file文件被JVM编译生成的Java类名
@file:JvmName("Stu") // 就是在编译器环节,修改我们的类的名字,让Java端调用更简洁
package com.ktbase.s7
// @file:JvmName("Stu") 注意:必须写在 包名的外面
// TODO 131-注解@JvmName与Kotlin
fun getStudentNameValueInfo(str : String) = println(str)
fun main() {}// Java调用
public class KtBase131 {public static void main(String[] args) {// KtBase131Kt.getStudentNameValueInfo("Derry is OK");Stu.getStudentNameValueInfo("Derry is OK a");}
}
- @JvmField
class Person {@JvmFieldval names = listOf("Zhangsan", "Lisi", "Wangwu")
}public class KtBase132 {public static void main(String[] args) {Person person = new Person();for (String name : person.names) {System.out.println(name);}}
}
- JvmOverloads
@JvmOverloads // 原理:编译器环节 专门重载一个函数,专门给 Java用
fun toast( name : String, sex : Char = 'M') {println("name:$name, sex:$sex")
}public class KtBase133 {public static void main(String[] args) {// Java端// KtBase133Kt.show("张三") // Java无法享用 KT的默认参数KtBase133Kt.toast("张三"); // 相当于 Java 享用 KT的默认参数}
}
- JvmStatic
class MyObject {companion object {@JvmFieldval TARGET = "黄石公园"@JvmStaticfun showAction(name: String) = println("$name 要去 $TARGET 玩")}
}public class KtBase134 {public static void main(String[] args) {// Java 端System.out.println(MyObject.TARGET);MyObject.showAction("Kevin");}
}