Kotlin语法(八)-方法和lambda表达式

方法

方法的声明使用’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标签”的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值