方法
方法的声明使用’fun’关键字,
fun double(x: Int): Int {
}
方法的使用和java一样,就不介绍了。
- 中缀标记的方法
中缀标记的方法使用关键字’infix’,它的使用有一些限制条件:
(1)必须是成员方法或者是扩展方法
(2)有一个参数
(3)使用关键字’infix’
infix fun Int.shl(x: Int): Int{
...
}
//我们可以这样调用这个方法
1 shl 2
//上边的调用等价于下面这个
1.shl(2)
- 带默认值得参数
方法在声明时可以有默认值,表示方法如下:
fun reformat(str: String,
normalizeCase: Boolean = true,
upperCaseFirstLetter: Boolean = true,
divideByCamelHumps: Boolean = false,
wordSeparator: Char = ' ') {
...
}
我们在调用这个方法时,第一个参数str是必须要传的,其他的参数可不传,但如此会带来一个问题,如果第三个参数upperCaseFirstLetter需要传一个值而其他参数需要默认值怎么办,在kotlin中方法参数的名称是保持原样的。所以我们在调用方法是可以明确写出哪个参数需要手动传值,哪些参数需要默认值。如下:
//如果有默认值的全部使用默认值,我们应该这样调用
reformat("hello")
//如果有的参数不适用默认值,我们可以这样调用
reformat("hello", true, true, true, '_')
//我们还可以这样调用
reformat("hello",
divideByCamelHumps = true,
wordSeparator = '_')
- 只有单个表达式的方法
如果一个方法体只有一个表达式且带有return关键字,我们可以用=号来代替大括号,如:
fun sum(x: Int, y: Int) = x + y
- 可变参数
在java中可变参数用…表示,而在kotlin中我们用修饰符”vararg”,如下:
fun <T> asList(vararg ts: T): List<T> {
val result = ArrayList<T>()
for (t in ts) // ts is an Array
result.add(t)
return result
}
//这样调用这个方法
val list = asList(1, 3, 5)
在一个方法中只有一个参数可以定义为可变参数,如果可变参数不是参数列表中的最后一个,那我们在调用这个方法时需要明确的这样“参数名 = 值“
我们在传可变参数时可以一个一个的传值,但有时我们已经有了一个数组时,我们可以将这个数组作为可变参数中的一个值,这时我们要用到一个展开操作符‘*’,如下:
val a = arrayOf(1, 2, 3)
val list = asList(-1, 0, *a, 4)
高阶方法
高阶方法就是其中的参数也是一个方法或者是返回一个方法。下面是一个例子:
fun <T> lock(lock: Lock, body: ()-> T): T{
lock.lock()
try{
return body()
}
finally {
lock.unlock()
}
}
在我们调用上面这个方法时,我们可以传一个另外一个方法的应用作为第二个参数,如:
fun toBeSynchronized() = sharedResource.operation()
val result = lock(lock, ::toBeSynchronized)
还有一种更便利的方法是:
lock(lock, { sharedResource.operation() })
- lambda表达式
lambda表达式可以作为一种类型,就跟String, Int一样。我们可以这样定义一个lambda类型:
val sum:(Int, Int) -> Int = {x, y -> x + y}
或
val sum = {x: Int, y: Int -> x + y}
在lambda表达式内可以有返回值,我们可以有两种表示方法:
(1)lambda中的最后一个表达式作为返回值;
(2)明确使用return关键字。但在使用return关键字时得这样:
ints.filter {
val shouldFilter = it > 0
return@filter shouldFilter
}
- 匿名方法
所谓匿名方法就是此方法没有方法名称,它的用法一般也是作为方法的参数。如下:
ints.filter(fun(item) = item > 0)
lambda表达式和匿名方法的不同点在于时候支持“非局部return”,return关键字用在匿名方法中是对这个匿名方法的返回,而用在lambda表达式中则不是对这个表达式的返回而是对包含此Lambda表达式的方法的返回。除非在lambda中用“return标签”的方法。