函数的定义和调用
集合
kotlin 并没有创建自己的集合类 而是使用java 的集合类 这样可以完美实现和java 的互相调用
创建:
- java :
Int [] array=new Int[count] List list=new ArrayList() Map map=new HashMap()
- kotlin
var array:IntArray=intArrayOf() var list =listOf() var map=hashMapOf()
区别比较大的就是数据的表示 由之前的[] 变成了 array
函数
kotlin中添加了命名空间和默认值
举个栗子
假设我们有一个从一个String串中获取制定位置的字符 的方式
- java :
定义 public char getChar(String str,int position)
调用 getChar(/*str*/ "abc",/*postion*/ 2)
- kotlin
定义 fun getChar(str :String,position:Int=0) //添加默认参数值
调用 getChar(str="abc",position =2)//更加优雅的命名参数
消除静态工具类
kotlin中 使用顶层函数和属性 来代替我们静态工具类定义
- java
class CalculateUtils{
public static finial String TAG="CU"
public static void add(int a.int b){...}
}
- kotlin:
在kotlin中我们可以创建类 我们直接创建 CalculateUtils.kt 不需要写class CalculateUtils{} 直接使用下面代码
const val TAG="CU"//顶层属性
fun add (a:Int,b:Int)//顶层方法
扩展方法/属性
- 方法
所谓扩展 就是能够随意的为任何类添加方法 并且能够想原生方法一样调用 神奇~
我们为String 添加一个方法 名字叫 lastCharPostion 用来获取最后一个字符的位置
我们任意创建一个类 AString.kt
fun String.lastCharPostion():int= length-1
ok 那么我们就可以直接使用了
var position ="authorName".lastCharposition() //输出的应该是9
但是如果再java中调用的话 就没有这么优雅了
AString.lastCharPostion("authorName")
注:顶层函数会被编译成一个静态函数 由于是静态函数 所以不支持重写
- 属性:
关于属性 我们前面说过 分为可变和不可变
不可变属性:只需要添加get方法 即可
val String.lastChar:Char
get()=get(length-1)
可变属性 需要同时定义set和get方法
var StringBuilder.lastChar:Char
set(value:Char){
this.setCharAt(length-1,value)
}
get()=get(length-1)
可变参数
java :
public int getMax(int... nums){...}//我们通常使用... 实现多个参数的表示 直接作为数组使用
kotlin:
fun getMax(vargra valuse:Int):Int{ val list=values.asList() }//使用 vararg实现多个参数表示 使用asList进行转换
键值对处理
中缀调用
kotlin 特有 什么是中缀调用呢 举个栗子
val map=mapOf(1 to "more",3 to "little")
所谓中缀调用就是去除分隔符 和添加符 函数名称直接放在参数中间 ------1.to("more") == 1 to "more"
那么我们看下为啥能这样写 方便以后我们自己使用
infix fun Any.to(other:Any) =Pair(this,other)
单纯看这个函数 我们发现返回值是一个Pair类型的对象 猜想是一对元素 那么 我们使用 to创建了一对元素 系统是如何获 取元素(展开)的呢 ----解构声明
解构声明不仅能够展开pair 同样适用于 map展开 我们可以将map展开成键值对
for((key,value) in maps.withIndex()){...} 遍历起来是不是简单多了
局部函数
kotlin特有功能 所谓局部函数 就是在函数中 可以套用函数 同时 局部函数能够访问外层函数所有的变量和参数 我不太喜欢
fun A(){
fun B(){
}
}
ok 函数部分我们写到这 ~