第三章(函数的定义与调用)

在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对象的实例添加额外的字段。

kotlinkotlin
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到数据库
}

总结:

  1. Kotlin没有定义自己的集合类,而是在Java集合类的基础上提供了更丰富的API。
  2. Kotlin可以给函数参数定义默认值,这样大大降低了重载函数的必要性,而且命名参数让多参数函数的调用更加易读。
  3. Kotlin允许更灵活的代码结构:函数和属性都可以直接在文件中声明,而不是仅仅在类中作为成员。
  4. Kotlin可以用扩展函数和属性来扩展任何类的API,包括在外部库中定义的类,而不需要修改其源码,也没有运行时开销。
  5. 中缀调用提供了处理单个参数的,类似调用运算符方法的简明语法。
  6. 局部函数帮助你保持代码整洁的同时,避免重复。

转载于:https://www.cnblogs.com/xxiaochao/p/11497240.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值