Kotlin-Lambda

前言

文中的案例可以在 这个网站 进行练习

说起Lambda,我们就会联想起函数式编程,高阶函数,闭包这几个名词。那么今天,我们就来弄清楚Lambda是什么东西,和这几个东西到底是什么关系?

高阶函数

具备以下两点的其中一点的函数,我们把它叫做 高阶函数

  • 将函数作为输入传给函数
  • 让函数返回函数

文章中,会围绕着下面这个类进行演示。

新建一个叫Calculator的类。这个类的作用是,根据外部传入的 函数类型 的值。来动态的计算两个Int类型的值。并且返回结果

里面有一个函数叫做calculate,返回一个Int类型的值,输入参数分别是:

  • 参数x,类型为Int
  • 参数y,类型为Int
  • 参数operator,类型为函数类型
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Calculator{
    //calculate是一个高阶函数,因为他满足上面我们所说的高阶函数的条件之一: 函数作为输入参数传给了函数
    fun calculate(x: Int, y:Int, operator: (Int, Int)-> Int): Int{
        return operator(x,y)
    }

    //这里直接抛出异常,而没有用到 !! ?. 的相关操作法,是为了让对这方面不熟悉的同学看的清晰
    fun calculateWithNullableOperator(x: Int, y: Int,operator:((Int,Int)->Int)?):Int{
        if (operator == null){
            throw NullPointerException()
        }
        return operator(x,y)
    }
}

它是什么

首先,Lambda是一个表达式。使用这个表达式,我们可以用来表示一个函数。那换句话说,Lambda是服务于函数的。

什么是表达式?它有什么作用?我们平时在写代码的过程中肯定是用过很多的表达式,这里以String为例子:

我们是用什么符号去表示一个String类型的值的,没错,就是用的双引号 " "

  • Lambda表达式是用来表示 函数类型 的值
  • 双引号 " " 是用来表示 String类型 的值

我们这么一对比,就能够对Lambda是一个什么东西有了一个大概的了解

What? 函数类型又是什么? 我们先来说一下这个东西

谈谈Kotlin中的SAM

首先,先说明一下什么是 SAMSAM Conversion

  • SAM,全称是Single Abstract Method。是一个 只有一个方法的接口

例如Android中的点击事件的监听器 OnClickListener 就是一个SAM

1
2
3
public interface OnClickListener {
    void onClick(View v);
}
  • SAM Conversion, 指的是通过 某种形式 ,转换为某个接口的具体实现。