简介
Lambda 表达式是 Java SE 8 中一个重要的新特性。Lambda 表达式允许你通过表达式来代替功能接口。本节将重点讲解 Lambda 相关知识内容。
知识点
- Lambda 表达式
- 函数式接口
- Stream 流
- FlatMap
什么是函数式编程
函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程典范,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且 λ 演算的函数可以接受函数当作输入(引数)和输出(传出值)。
Lambda 表达式
一个 Lambda 表达式具有下面这样的语法特征。它由三个部分组成:第一部分为一个括号内用逗号分隔的参数列表,参数即函数式接口里面方法的参数;第二部分为一个箭头符号:->;第三部分为方法体,可以是表达式和代码块。语法如下:
parameter -> expression body
下面列举了 Lambda 表达式的几个最重要的特征:
- 可选的类型声明:你不用去声明参数的类型。编译器可以从参数的值来推断它是什么类型。
- 可选的参数周围的括号:你可以不用在括号内声明单个参数。但是对于很多参数的情况,括号是必需的。
- 可选的大括号:如果表达式体里面只有一个语句,那么你不必用大括号括起来。
- 可选的返回关键字:如果表达式体只有单个表达式用于值的返回,那么编译器会自动完成这一步。若要指示表达式来返回某个值,则需要使用大括号。
需要注意的是:
- Lambda 表达式优先用于定义功能接口在行内的实现,即单个方法只有一个接口。在上面的例子中,我们用了多个类型的 Lambda 表达式来定义 MathOperation 接口的操作方法。然后我们定义了 GreetingService 的 sayMessage 的实现。
- Lambda 表达式让匿名类不再需要,这为 Java 增添了简洁但实用的函数式编程能力。
几个问题:
1,MathOperation是接口,为什么前面可以用MathOperation 来创建对象
首先,接口是不能用来创建对象的,接口只能声明方法,需要具体的类来实现接口的方法。
在这里我们使用Lambda语句编写的代码,Lambda语句好用的地方就在于,它可以通过用匿名的方法简略代码的编写,这里用的是匿名内部类的思想
气势上是MathOperation XXX(匿名的类)addition 这里的类是匿名的,addition是方法,MathOperation只是一个接口,强调的是,匿名的类要实现接口中声明的方法
2,MathOperation接口中声明的方法,为何在代码块中没有找到
Lambda语句不但类是匿名的,方法也是匿名的。其实addition (int a,int b) -> ()后面的方法语句就是对应MathOperation中的Operation方法。
所以addition, subtraction ,multiplication,division分别是MathOperation接口的四种实现,并且对应的对象。
lamda表达式就是特殊的匿名内部类写法
用了lambda表达式就是在匿名地实现单抽象方法的接口或者抽象类
作用域
我们可以通过下面这段代码来学习 Lambda 的作用域
可以得到以下结论:
- 可访问 static 修饰的成员变量,如果是 final static 修饰,不可再次赋值,只有 static 修饰可再次赋值;
- 可访问表达式外层的 final 局部变量(不用声明为 final,隐性具有 final 语义),不可再次赋值。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
以下是lambda表达式的重要特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
Lambda 表达式实例
Lambda 表达式的简单例子:
在 Java8Tester.java 文件输入以下代码:
lambda允许把函数的方法作为传入函数的参数。
private int operate(int a , int b ,MathOperation mathOperation)
这里的传入参数,MathOperation mathOperation 传入了一个接口。接口是一个模板,可以用其他的类来实现该接口。
这是MathOperation{}的接口,需要用其他的类来实现。
MathOperation是一个接口,