zoukankan      html  css  js  c++  java
  • Kotlin基础(二)函数的定义与调用

    函数的定义与调用

    一、预备知识:在Kotlin中创建集合

     1 fun main(args: Array<String>) {
     2     //Kotlin中定义各自集合
     3     val set= hashSetOf<Int>(1,2,8,0)
     4     val list= arrayListOf<Int>(1,99,88)
     5     val map= hashMapOf<Int,String>(1 to "one",2 to "tow")
     6 
     7     //为了更容易与Java代码交互,Kotlin采用的是标准的Java集合类
     8     println(set.javaClass)
     9     println(list.javaClass)
    10     println(map.javaClass)
    11 
    12     /*class java.util.HashSet
    13     class java.util.ArrayList
    14     class java.util.HashMap*/
    15 
    16     //与Java不同,可以这样用
    17     println(set.max())
    18     println(list.last())
    19 }

    二、让函数更好地调用

    一)命名参数和默认参数值

     1 class Doa{
     2     fun <T> joinToString(
     3             collection: Collection<T>,
     4             //参数默认值
     5             separator: String="|",
     6             prefix: String="{",
     7             postfix: String="}"
     8     ): String{
     9         val result=StringBuilder(prefix)
    10 
    11         for ((index,element) in collection.withIndex()){
    12             if (index>0) result.append(separator)
    13             result.append(element)
    14         }
    15 
    16         result.append(postfix)
    17         return result.toString()
    18     }
    19 }
    20 
    21 fun main(args: Array<String>) {
    22 
    23     val doa = Doa()
    24     val list= listOf<Int>(1,2,3,4,5,6)
    25     //函数调用时可以指明参数名,被省略的采用默认值
    26     val str = doa.joinToString(collection = list,separator = "\")
    27     println(str)
    28 }

    二)消除静态类工具:顶层函数和属性

    //该注解重命名自动生成的类名
    @file:JvmName("ALei")
    package gemetry
    
    //顶层属性
    var count=0
    
    //编译器会自动生成与文件名同名的类,顶层函数是类中的静态方法
    fun <T> joinToString(
            collection: Collection<T>,
            //参数默认值
            separator: String="|",
            prefix: String="{",
            postfix: String="}"
    ): String{
        count++
        val result=StringBuilder(prefix)
    
        for ((index,element) in collection.withIndex()){
            if (index>0) result.append(separator)
            result.append(element)
        }
    
        result.append(postfix)
        return result.toString()
    }
    
    fun main(args: Array<String>) {
        var list= listOf<Int>(8,9,6)
        println(joinToString(list))
        println("The function is executed $count times")
    }

    三、给别人的类添加方法:扩展函数和属性

    package gemetry
    
    //只要一个类能被JVM编译成类,就可以定义扩展函数
    //在扩展函数中可以直接访问扩展的类其他方法和属性
    //但是并不允许打破其封装性,不能访问私用的和受保护的成员
    fun String.lastChar(): Char=get(length-1)
    //fun String.lastChar() : Char=this.get(this.length-1)
    
    fun main(args: Array<String>) {
        println("Kotlin".lastChar())
    }

    在Java中使用扩展函数:

     1 package gemetry;
     2 
     3 public class UseExtension {
     4 
     5     public static void main(String[] args){
     6         //实质上扩展函数就是一个静态函数
     7         char c=ExtensionMethodKt.lastChar("Java");
     8         System.out.println(c);
     9     }
    10 }

    注意:既然扩展函数实质是一个静态函数,当然不能被子类重写

    2.如果一个类的成员函数和扩展函数有相同的签名,成员函数会被优先使用

    当然可以这么玩儿:

    1 fun Collection<String>.join(
    2         separator: String=",",
    3         prefix: String="(",
    4         postfix: String=")"
    5 )=joinToString (separator,prefix,postfix)

    关于扩展属性,你可以把它当作扩展函数的值。

    四、处理集合:可变参数、中缀调用和库的支持

    一)可变参数

    //可变参数声明
    fun test(vararg values: String){
        for (value in values){
            println(value)
        }
    }
    
    fun main(args: Array<String>) {
        test("tang","jiu","jia")
        //与Java中不同,可以这样使用可变参数,此功能被称为展开运算符
        var list= arrayOf("TANG","JIA","PI")
        test(*list)
    }

    二)键值对处理:中缀调用和解构声明

     1 //下面的代码"to"不是内置结构,而是一种特殊的函数调用,被称为中缀调用
     2 val map= mapOf<Int,String>(1 to "one",2 to "tow")
     3 //区别一般函数调用
     4 //1.to("one")
     5 
     6 /**
     7  * 中缀调用可以与只有一个参数的函数一起使用,无论是普通函数还是扩展函数
     8  * 要允许使用中缀符号调用函数,需要使用infix修饰符来标记它。
     9  */
    10 infix fun String.too(other: String)=Pair(this,other)
    11 
    12 fun main(args: Array<String>) {
    13     //可以这样初始化"一对"变量
    14     val (number,name)= "one" too "Shadowplay"
    15     println("$number: $name")
    16 }

    五、字符串和正则表达式的处理

    1 String str="78.11-7.B";
    2         //Java中Split方法的缺陷:不适用于".",这里返回的list为一个空数组
    3         //因为他将一个正则表达式作为参数,并根据表达式将字符串成多个字符串
    4         String[] list = str.split(".");
    5         for (String value:list){
    6             System.out.println(value);
    7         }
    1 fun main(args: Array<String>) {
    2     //Kotlin把这个令人费解的函数隐藏了,并提供了一个可正常使用的重载函数。
    3     val javaSplit: String="78.11-7.B"
    4     val list = javaSplit.split(".")
    5     for (str in list) println(str)
    6     //可指定多个分隔符
    7     println(javaSplit.split(".","-"))
    8 }
     1 /**
     2 * 使用扩展函数来解析字符串
     3 * */
     4 fun parsePath(path: String){
     5     val dir=path.substringBeforeLast("/")
     6     val fullName=path.substringAfterLast("/")
     7     val fileName=fullName.substringBeforeLast(".")
     8     val extension=fullName.substringAfterLast(".")
     9 
    10     println("Dir: $dir, name: $fileName, extension: $extension")
    11 }

    六、让你的代码更整洁:局部函数及扩展

     1 fun saveUser(user: User){
     2     //局部函数可以访问所在函数中的所有参数和变量
     3     fun validate(value: String,fileName: String){
     4         if (value.isEmpty()){
     5             throw IllegalArgumentException("Can't save user ${user.id} empty $fileName")
     6         }
     7     }
     8     validate(user.name,"Name")
     9     validate(user.address,"Address")
    10 }
    Simple is important!
  • 相关阅读:
    Hibernate持久化对象修改id重新保存的办法
    hibernate实现数据实体复制保存
    MySQL 语句中执行优先级——and比or高
    Unity3D研究院之静态自动检查代码缺陷与隐患
    MVC模式在游戏开发的应用
    Unity3D的LightProbe动态光探头用法介绍
    高达渐出现效果Shader
    Unity3D战争迷雾效果
    从3D Studio Max导入物体 Importing Objects From 3D Studio Max
    从maya导入物体 Importing Objects From Maya
  • 原文地址:https://www.cnblogs.com/Shadowplay/p/7922868.html
Copyright © 2011-2022 走看看