规范化代码
lambda表达式
lambda 和 匿名类
- lambda相比于匿名类,没有方法名称和文档。
- lambda适用于三行以内的代码;匿名类适用于三行以外的代码。
- 禁止序列化 lambda表达式或匿名类实例。
方法引用和lambda
- 视情况选用方法引用和lambda表达式。如果方法引用更清晰、简介,选用方法引用;否则坚持lambda。
方法引用类型 | 方法引用示例 | lambda等式 |
---|---|---|
静态引用 | Integer::parseInt | str -> Integer.parseInt(str) |
有限制引用 | Instant.now()::isAfter | Instant then = Instant.now(); t -> then.isAfter(t) |
无限制引用 | String::toLowerCase | str -> str.toLowerCase(); |
类构造方法引用 | Student::new | () -> new Student(); |
数组构造方法引用 | int[]::new | length -> new int[length] |
推荐使用标准函数式接口
- java.util.function包中已存在大量标准函数式接口,无需重复创建函数式接口。
- 必须使用@FunctionalInterface注解声明函数式接口。
Predicate接口
Predicate接口:只有一个参数,返回boolean值的函数。
源码示例
boolean test(T t);
Function接口
Function接口:只有一个指定类型的参数、指定类型返回值的函数。
源码示例
R apply(T t);
Operator接口
Operator接口:只有一个指定类型的参数、且和参数类型一致的返回值 的函数。
某种程度上来说,就是Function接口。
源码示例
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
static <T> UnaryOperator<T> identity() {
return t -> t;
}
}
Supplier接口
Supplier接口:没有参数,指定了类型返回值 的函数。
源码示例
T get();
Consumer接口
Consumer接口:只有一个指定类型的参数、没有返回值的函数。
源码示例
void accept(T t);
stream api
为什么使用stream
stream代码简介,且易于维护。
注意
-
谨慎使用 stream api。滥用stream会导致代码难以维护。
-
优先使用无副作用的函数。
-
优先使用 Collection 作为返回类型。
-
谨慎使用 parallel并行流。