第五章:Lambda编程

Lambda表达式和成员引用

  1. Lambda本质上是可以传递给其他函数的一小段代码
  2. 函数式编程提供了另外一种解决问题的方法:把函数当作值 来对待;
  3. Lambda和集合
    • maxBy{} 指定比较哪个值找到最大元素,需要一个参数:一个函数
    • 可以使用**it(默认参数名称)**来指定集合中的元素,如果当前上下文期望的是只有一个参数的lambda且这个参数的类型是可以被推断出来的;
    • 成员引用 ::
      在这里插入图片描述
      在这里插入图片描述
  4. Lambda表达式语法
    在这里插入图片描述
  5. 可以把lambda表达式存储在一个变量中,把这个变量当作普通函数对待;
  6. 如果需要把一小段代码封闭在一个代码块中,可以使用run来执行
    在这里插入图片描述
  7. 如果lambda表达式是函数调用的最后一个实参,它可以被放到括号的外边;
    在这里插入图片描述
    当lambda是函数唯一的实参,还可以去掉调用代码中的空括号
  8. 在函数内声明一个lambda,可以引用这个函数的参数和局部变量(不局限于final变量),也可以修改这些变量;

集合的函数式API

  1. filter 从集合中找寻满足条件的所有元素;
    在这里插入图片描述
  2. map 对集合中的每一个元素应用给定的函数并把结果收集到一个新集合;
    在这里插入图片描述
  3. all 判断集合中的所有元素是否满足某个条件 返回布尔值类型;
  4. any 判断集合中是否至少有一个元素满足条件 返回布尔值类型;
    any = !all
  5. count 返回集合中满足条件的个数
  6. find 找到集合中第一个满足条件的元素,如果没有返回Null 等价于 firstOrNull ;
  7. groupBy 根据条件把集合转换成分组的map
  8. flatMap 根据作为实参给定的函数对集合中的每个元素做变换,然后把多个列表合并成一个列表
    在这里插入图片描述

序列:惰性集合操作

在这里插入图片描述

使用序列的目的:提高效率

Kotlin惰性集合操作的入口是Sequence接口

  1. 使用asSequence() 方法把任意的集合转换成序列,调用toList来做反向的转换;
  2. 执行序列操作:中间操作和末端操作中间操作返回另外一个序列,末端操作返回一个结果,结果可能是集合、数字或者元素;
    中间操作始终都是惰性的,末端操作才能触发所有的延期计算;
    序列的执行顺序是按顺序应用在每一个元素上,处理完第一个元素,然后完成第二个元素的处理;
    在这里插入图片描述
  3. 集合与序列执行的差别
    集合是及早操作,会根据调用的函数来操作;
    序列是惰性操作,会对每一个元素做相应的处理;
    在这里插入图片描述
  4. 创建序列: generateSequence() 需要一个seed和一个lambda表达式;给定序列中的前一个元素,这个函数会计算出下一个元素;

使用Java函数式接口

SAM构造方法只接收一个参数——一个被用作函数式接口单抽象方法体的lambda——并返回实现了该接口的类的一个实例;

在这里插入图片描述

带接收者的lambda

  1. with
    接收两个参数;第一个是实参数, 第二个是lambda表达式;
    把第一个参数转换成作为第二个参数传给它的lambda的接收者;在lambda中可以不用任何限定符直接访问第一个参数的属性和方法;
    with的返回值是lambda中最后一个表达式;
    在这里插入图片描述
  2. apply
    扩展函数
    与with函数类似,差别是:apply始终会返回作为实参传递给它的对象(返回接收者的对象),返回第一个参数;
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ChrisSen/article/details/88552477