函数的定义与调用

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

 fun main(args: Array<String>) {
//Kotlin中定义各自集合
val set= hashSetOf<Int>(,,,)
val list= arrayListOf<Int>(,,)
val map= hashMapOf<Int,String>( to "one", to "tow") //为了更容易与Java代码交互,Kotlin采用的是标准的Java集合类
println(set.javaClass)
println(list.javaClass)
println(map.javaClass) /*class java.util.HashSet
class java.util.ArrayList
class java.util.HashMap*/ //与Java不同,可以这样用
println(set.max())
println(list.last())
}

二、让函数更好地调用

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

 class Doa{
fun <T> joinToString(
collection: Collection<T>,
//参数默认值
separator: String="|",
prefix: String="{",
postfix: String="}"
): String{
val result=StringBuilder(prefix) for ((index,element) in collection.withIndex()){
if (index>) result.append(separator)
result.append(element)
} result.append(postfix)
return result.toString()
}
} fun main(args: Array<String>) { val doa = Doa()
val list= listOf<Int>(,,,,,)
//函数调用时可以指明参数名,被省略的采用默认值
val str = doa.joinToString(collection = list,separator = "\\")
println(str)
}

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

//该注解重命名自动生成的类名
@file:JvmName("ALei")
package gemetry //顶层属性
var count= //编译器会自动生成与文件名同名的类,顶层函数是类中的静态方法
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>) result.append(separator)
result.append(element)
} result.append(postfix)
return result.toString()
} fun main(args: Array<String>) {
var list= listOf<Int>(,,)
println(joinToString(list))
println("The function is executed $count times")
}

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

package gemetry

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

在Java中使用扩展函数:

 package gemetry;

 public class UseExtension {

     public static void main(String[] args){
//实质上扩展函数就是一个静态函数
char c=ExtensionMethodKt.lastChar("Java");
System.out.println(c);
}
}

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

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

当然可以这么玩儿:

 fun Collection<String>.join(
separator: String=",",
prefix: String="(",
postfix: String=")"
)=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)
}

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

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

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

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

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

 fun saveUser(user: User){
//局部函数可以访问所在函数中的所有参数和变量
fun validate(value: String,fileName: String){
if (value.isEmpty()){
throw IllegalArgumentException("Can't save user ${user.id} empty $fileName")
}
}
validate(user.name,"Name")
validate(user.address,"Address")
}

Kotlin基础(二)函数的定义与调用的更多相关文章

  1. C#基础知识-函数的定义和调用(五)

    函数也可以称为方法,可以很方便的把一些行为封装到函数里面,当调用这一函数时会把函数块里面的代码按照顺序执行,方法可以有多种形式,有无参数,有无返回值等. 1. 函数的定义   函数定义的基本格式: s ...

  2. python函数基础(函数的定义和调用)

    函数的定义 python定义函数使用def关键字 return[表达式]语句用于退出函数,选择性的向调用方返回一个表达式,不带参数值的return语句返回none def 函数名(参数列表): 函数体 ...

  3. Python函数的定义与调用、返回值、参数

    一.函数是什么 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.比如print(),len()等.但你也可以自己创建函数,这被叫做用户自 ...

  4. 12_传智播客iOS视频教程_注释和函数的定义和调用

    OC的注释和C语言的注释一模一样.它也分单行注释和多行注释. OC程序里面当然可以定义一个函数.并且定义的方式方法和调用的方式方法和我们C语言是一模一样的.OC有什么好学的?一样还学个什么呢? 重点是 ...

  5. Python基础--函数的定义和调用

    一.函数的作用: 提高代码的可读性,减少代码的冗余,方便调用和修改,组织结构清晰 二.函数的定义:函数遵循先定义后调用的原则 1.无参函数 def funcname(): #def 是关键字,后跟函数 ...

  6. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  7. python基础三---- time模块,函数的定义和调用

    此处重点说明一下: 注意: 1.用例之间不要存在依赖关系,每个用例都可以单独运行 2.用例不要互相调用,需要调用的公共方法可以写成方法去调用 1.等待 (在脚本运行的时候,有些线程之间需要间隔时间,可 ...

  8. Kotlin——基础的函数/方法详解

    对于Kotlin中的函数来说,和JavaScript或者Lua这些语言很像,它有着这些语言的特性.但是也与这些语言就着许多不同之处.或许你更了解Java语言,然而对于Java语言来说,它不是不是闭包这 ...

  9. python中函数的定义及调用

    python中函数的定义及使用方法 1.函数的概念:函数是将具有独立功能的代码块组织为一个整体,使其具有特殊功能的代码集; 2.函数的作用:使用函数可以加强代码的复用性,提高程序编写的效率; 3.函数 ...

随机推荐

  1. 拓展中国剩余定理(ex_crt)

    一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...

  2. ajax---异步请求对象的属性和方法

    方法: 1).open(method.url,asyn):创建请求,(post.get)asyn:表示同步(false)还是异步(true)提交 ,默认true 2)send(body) 发送请求,b ...

  3. mysql optimize table

    mysql 数据文件的使用是只扩展,不回收.对表执行delete之后,磁盘上数据文件是不会缩小的. 通常的做法,是先逻辑导出,然后truncate 原表(或者删除重建),再导入. 另外还有一种方法是o ...

  4. ORACLE EHCC(exadata hybrid columnar compression)

    目录: 1. 简介 2. 压缩方式及压缩比 3. 压缩哪些数据 4. 可能有用的脚本 一.简介 EHCC(Exadata Hybrid Columnar Compression),是Oralce 数据 ...

  5. 滴水穿石-07Java开发中常见的错误

    1:使用工具Eclipse 1.1 "语法错误" 仅当源级别为 1.5 时已参数化的类型才可用 设置eclipse,窗口—>java—>编译器—>JDK一致性调到 ...

  6. [转] 谈谈JS中的函数节流

    函数节流的目的 从字面上就可以理解,函数节流就是用来节流函数从而一定程度上优化性能的.例如,DOM 操作比起非DOM 交互需要更多的内存和CPU 时间.连续尝试进行过多的DOM 相关操作可能会导致浏览 ...

  7. 替罪羊树&&非旋treap

    题解: 替罪羊树的模板和splay差距还是比较大的.. 按照我的splay的写法 真是都是问题.. 替罪羊树就是暴力的搞 当某颗子树大小大于这棵树的alpha时 就退出 另外删除的时候打懒标记删除 当 ...

  8. 【前端基础系列】slice方法将类数组转换数组实现原理

    问题描述 在日常编码中会遇到将类数组对象转换为数组的问题,其中常用到的一种方式使用Array.prototype.slice()方法. 类数组对象 所谓的类数组对象,JavaScript对它们定义为: ...

  9. 【C#】WebApi 添加过滤器,实现对请求参数和响应内容的日志记录

    filter的介绍 filter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等:Web API提供两种过滤器的基本类型:actionfilterattribute,excep ...

  10. 【Android】Android 中string-array的用法

    在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的arrays.xml文件里 <?xml version= ...