lambda
- lambda 提供一种简化代码的方式;
- lambda 可以视作一个只有函数参数和方法体的方法, 没有修饰符、函数名和返回值声明;
- 实现内部类的效果(也内部类类似但有不同点)
- 能使用 lambda 的接口, 是函数式接口(接口内只有一个抽象方法)
参数
- 参数可以声明类型, 也可以不声明而由上下文自动推导出类型
- 参数放在()里, 多个参数使用 "," 分开
- 一个参数且类型是自动推导出来的, 那么 () 可以省略;
- 零个参数可以直接写();
表达式
- 表达式可以有若干条, 只有一条时, "{}" 可以省略;
- 只有一行的话, return 可以省略
一些概念
函数式接口
- 只拥有一个方法的接口称为 函数式接口
- 编译器可以自动判断一个接口是否是函数式接口
- @FunctionalInterface 注解来显式指定一个接口是函数式接口
java.util.function,它里面包含了常用的函数式接口,例如:
- Predicate
——接收 T 并返回 boolean - Consumer
——接收 T,不返回值 - Function
——接收 T,返回 R - Supplier
——提供 T 对象(例如工厂),不接收值 - UnaryOperator
——接收 T 对象,返回 T - BinaryOperator
——接收两个 T,返回 T
与 java.util.stream.Stream 配合
在 Stream 配合使用
// 该例子来源 docs.oracle.com
roster
.stream()
.filter(
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25)
.map(p -> p.getEmailAddress())
.forEach(email -> System.out.println(email));