Kotlin学习之高阶函数和Lambda表达式的基础用法

Kotlin学习之高阶函数和Lambda表达式的基础用法

一、定义和调用高阶函数的写法

kotlin.collections._Arrays.kt中的mapTo()函数的源码如下:

mapTo()是Array类型的扩展函数,它可以接受两个参数,第一个参数是表示C类型的MutableCollection,第二个参数是一个(T)->R类型的参数。mapTo()函数会遍历数组中的每个元素,对这个元素调用传入的函数transformation,再将transformation的返回值添加到可变集合destination中,最后返回destination。

在定义高阶函数时,对于作为参数传入和作为返回值输出的函数,都必须用(参数列表类型)->返回值类型的形式标示清楚,在高阶函数内可以调用作为参数传入的函数。

要调用高阶函数,可以先定义一个函数,再将函数作为参数传入高阶函数内

定义一个名为square的函数,它接受一个Int类型的参数,返回它的平方根,然后我们用函数引用的形式把它传入mapTo()函数内。这种方法适用于要执行的操作已有函数定义时。

函数引用是什么?

它的写法是在函数名前加上::用来表示函数对象,而不是调用这个函数。

调用高阶函数的另一个方法是使用匿名函数或Lambda表达式传入所需的参数

上面调用mapTo()时,如果没有外部定义square函数,就需要使用匿名函数或Lambda表达式传入我们要执行的操作,如下:

或者用Lambda表达式代替匿名函数:

同时,高阶函数还规定,如果高阶函数的最后一个参数是Lambda表达式,可以把Lambda表达式写在括号外面

二、Lambda表达式的写法

Lambda表达式的完整写法应该是这样的:

例如之前的sum函数:

但是一般情况下,编译器可以推断出参数的类型,一般可以省略参数类型,上面的mapTo()就可以写成:

因为array是Array类型,所以a被自动推导为Int类型,a*a也是Int类型,整个Lambda表达式就是(Int)->Int类型了。

Lambda还规定,如果Lambda只有一个参数,而且能够推断出它的类型,就可以省略参数说明,只写函数体,在函数题中用it调用这个参数:

但是,在使用Lambda表达式时,必须明白it是什么,不能想当然,否则就会出现错误

forEach()函数接受一个(T)->Unit类型的函数,对map中的每一个元素执行传入函数的操作。it是Map.Entry类型,打印结果如下:

为什么回事这样的呢?

因为forEach()函数里用的形式遍历Map,实际上调用了Map的迭代器,而Map的迭代器迭代的是Map.Entry对象,所以这里的it就是Map.Entry类型,打印时调用的是Map.Entry对象的toString()方法。

如果只打印map的值,该怎么办?

学海无涯苦作舟

本文来自企鹅号 - Android成长录媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ios 技术积累

二进制、八进制、十进制、十六进制相互转换

方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。(具体用法如下图)

15620
来自专栏Android机器圈

Java中list<Object[]>、list<Student>、list<Map<String,String>>排序

1:list<Object[]>的排序 public static void main(String[] args) { // TODO Auto-gene...

64180
来自专栏Google Dart

Dart 中构造函数定义与使用详解 原

在这种没有构造函数的情况下Dart会为其隐式定义一个默认构造函数(与类名相同、无参数)

24620
来自专栏一直在跳坑然后爬坑

Kotlin之“AbstractMutableList”

打印结果分别为 prefix1:2:3:4:5:6postfix prefix1:2:3:truncatedpostfix

18020
来自专栏Java技术分享

增强for循环

jdk1.5出现的新特性---->增强for循环

24960
来自专栏Android机动车

转向Kotlin——高阶函数与Lambda表达式

在调用高阶函数时使用Lambda表达式,可以使调用语法更加简洁,不过要想使用这种调用方式,就需要深入了解Lambda表达式的用法。

13530
来自专栏Java帮帮-微信公众号-技术文章全总结

似懂非懂 Comparable和 Comparator【面试+工作】

在java中提供了两种排序方式:Comparable和 Comparator,它们两个看起来非常的相似,在不是很了解的情况下不知道如何使用,什么情况下使用哪个进...

12330
来自专栏程序员互动联盟

【编程基础】c printf知多少

printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是用%c 符号.这些符号被称为...

34550
来自专栏郭耀华‘s Blog

Java集合框架(六)—— Collections工具类

操作集合的工具类Collections   Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法...

27440
来自专栏Android开发指南

10.TreeSet、比较器

403100

扫码关注云+社区

领取腾讯云代金券