在Kotlin中创建集合
Kotlin没有采用它自己的集合类,而是采用的标准的Java集合类。
创建集合
val set = hashSetOf(1,2,3)
val list = arrayListOf(1,3,5)
val map = hashMapOf(1 to "one",7 to "sevent",53 to "fifty-three")
遍历集合
for (i in 0 until set.size){
println("set[$i]= ${set.elementAt(i)}")
}
for ((key,values) in map){
println("key=$key----value=$values")
}
Kotlin集合中的一些其他语法
println(list.max())//打印集合中最大的元素
println(list.first())//打印集合中第一个元素
命名参数
在Java中,一个函数中如果传入过多参数,尤其是布尔类型的参数过多后,函数的可读性会大大降低,而在Kotlin中,可以通过命名参数来提高函数的可读性:
fun main(args: Array<String>) {
test(isNormal = true, isSelected = false, isLoading = true)
}
fun test(isNormal: Boolean, isSelected: Boolean, isLoading: Boolean) {
}
默认参数值
函数中的参数可以给其设置一个默认值,当参数使用了默认值时,在调用函数的时候则可以省略掉该参数。
fun overLoad(a: String = "a", b: String = "b", c: Int = 0, d: Boolean =
true) {//全都设置了默认值,所以参数全部可以省略
println("a=$a b=$b c=$c d=$d")
}
fun main(args: Array<String>) {
overLoad()
overLoad(a="hello", b="bbb")
overLoad("hello", "bbb", 1)
// 当省略的是前面的参数(a,b)时,那么后面的需要使用命名参数表示,否则会编译不通过
overLoad(c = 1, d = false)
}
顶层函数与属性
在Java中我们经常需要写一些静态工具类,而在Kotlin中,我们只需要新建一个Kotlin文件,然后将函数定义在Kotlin文件的顶层,不要放到类中去,在其他地方就可以调用我们定义在顶层的函数,相当于Java中的静态函数。同理,定义顶层属性也一样,默认情况下,顶层属性和其他任意的属性一样,是通过访问器暴露给Java使用的(如果是val就只有一个getter,如果是var就对应一对getter和setter)。当然,在Kotlin中,也可以通过const关键字修饰来表示这个属性是 static final
的。
扩展函数和扩展属性
扩展函数
扩展函数非常简单,它就是一个类的成员函数,不过定义在类的外面。扩展函数不能被重写。
例如,我们想给String新增一个函数,lastChar(),用来获取String的最后一个字符串,如果在Java中,我现在知道的就是写一个类来继承String,然后在自己新写的类中定义lastChar()方法,而在Kotlin中,要给String扩展lastChar()函数就简单多了,只需要在一个Kotlin文件中的定义扩展函数(要是顶层函数)即可。如下:
fun String.lastChar(): Char {
//这里的this表示的就是调用lastChar()方法时传入的String字符串
return this.get(this.length - 1)
}
fun main(args: Array<String>) {
//调用lastChar方法,打印出o
println("hello".lastChar())
}
作为扩展函数,如果我们在其他地方调用扩展函数的时候需要修改调用函数名,可以在导入扩展函数的时候通过as关键字来转换。代码如下:
//这里是导入lastChar函数,strings表示包名,last表示你想要调用该函数的名字
import strings.lastChar as last
fun main(args: Array<String>) {
//调用last方法,打印出o
println("hello".last())
}
扩展属性
扩展属性提供了一种方法,用来扩展类的API,可以用来访问属性,用的是属性语法而不是函数的语法。尽管它们被称为属性,但它们可以没有任何状态,因为没有合适的地方来存储它,不可能给现有的Java对象的实例添加额外的字段。
kotlin
kotlin
val String.lastChar: Char
get() = get( length -1 )//get( length -1 ) 为String的方法,返回Char
//声明一个可变的扩展属性
var StringBuilder.lastChar: Char
get() = get( length-1 )
set(value: Char) {
this.setCharAt( length-1,value)
}
//可以像访问使用成员属性一样访问他
println("Kotlin".lastChar) ------>n
val sb = StringBuilder("Kotlin?")
sb.lastChar = '!'
println(sb)------>Kotlin!
可变参数与中缀调用
可变参数
可变参数用 vararg
修饰
fun main(args: Array<String>) {
test("1","2","hello world","hello kotlin")
}
fun test(vararg str:String){
for (i in 0 until str.size){
println(str[i])
}
}
中缀调用
中缀调用可以与只有一个参数的函数一起使用,无论是普通的函数还是扩展函数。要允许使用使用中缀符号调用函数,需要使用 infix
修饰符来标记它。下面是一个简单的 to
函数的声明。(其中Pair是Kotlin标准库中的类,它会用来表示一对元素。)
infix fun Any.to(other: Any) = Pair(this, other)
to
函数的调用
val map = mapOf(1 to "one",7 to "seven")
上面代码中单词to
不是内置的结构,而是一种特殊的函数调用,被称为中缀调用,在中缀调用中,没有添加额外的分隔符,函数名称是直接放在目标对象名称和参数之间的。其和以下的调用方式是等价的:
1.to("one")
1 to "one"
局部函数和扩展
使用局部函数,来解决常见的代码重复问题。在下面的例子中,saveUser函数用于将user的信息保存到数据库,并且确保user的对象包含有效数据。
class User(val id: Int, val name: String, val address: String)
fun saveUser(user: User){
if(user.name.isEmpty()){
println("user Name为空")
}
if(user.address.isEmpty()){
println("user Address为空")
}
//保存前可能还有很多字段需要判断不为null,重复代码较多
//保存到数据库
}
接下来用Kotlin将判断逻辑提取到扩展函数
class User(val id: Int, val name: String, val address: String)
fun User.validateBeforeSave(){
fun validate(value: String, fileldName: String){
if(value.isEmpty()){
println("user $fileldName 为空")
}
}
validate(name,"Name")
validate(address,"Address")
}
fun saveUser(user: User){
user.validateBeforeSave()
//保存user到数据库
}
总结:
- Kotlin没有定义自己的集合类,而是在Java集合类的基础上提供了更丰富的API。
- Kotlin可以给函数参数定义默认值,这样大大降低了重载函数的必要性,而且命名参数让多参数函数的调用更加易读。
- Kotlin允许更灵活的代码结构:函数和属性都可以直接在文件中声明,而不是仅仅在类中作为成员。
- Kotlin可以用扩展函数和属性来扩展任何类的API,包括在外部库中定义的类,而不需要修改其源码,也没有运行时开销。
- 中缀调用提供了处理单个参数的,类似调用运算符方法的简明语法。
- 局部函数帮助你保持代码整洁的同时,避免重复。