Lambda表达式是一个可传递的代码块,可以在以后执行一次货多次。
(String first, String second) -> first.length() - second.length();
(String first, String second) ->
{
if ( fisrt,length() < second.length() ) return -1;
else if( fisrt.length() > second.length() ) return 1;
else return 0;
}
() -> { for (int i=0; i<10; i++) System.out.println(i); }
// 如果可以推导出参数类型,则可以省略
Comparator<String> cmp = (fisrt, second) -> first.length() - second.length();
// 如果方法只有一个参数,且参数类型可被推导出
ActionListener listener = event -> System.out.println(event);
// 函数式接口
Arrays.sort( persons,
(p1, p2) -> p1.salary - p2.salary );
供应者,实现懒计算
LocalDate hireDay = Objects.requireNonNullOrElse(day, new LoacalDate(1970,1,1));
// 非最优。如果day很少为null,则希望旨在必要时才构造默认的LocalDate
LocalDate hireDay = Pbjects.requireNonNullOrElse(day,
() -> new LocalDate(1970,1,1));
方法引用
当 Lambda 表达式的体只调用一个方法而不做其他操作时,才能把 Lambda 表达式重写为方法应用
var timer = new Timer(1000, event -> System.out.println(event) );
var timer = new Timer(1000, System.out::println );
Arrays.sort(words, String::compareToIgnoreCase);
// 以下有一个方法调用,但此外还有一个比较。因此不能使用方法调用
s -> s.length() == 0
处理Lambda
使用Lambda 表达式的重点是延迟执行。
如果需要立即执行代码,完全可以直接执行
之所以希望以后再执行代码,原因如下:
- 在一个单独的线程中运行代码
- 多次运行代码
- 在算法的适当位置运行代码(例如,排序中的比较操作)
- 发生某种情况时执行代码(例如,点击了一个按钮,数据到达,等等)
- 只在必要时才运行代码
函数式接口
repeat(10, () -> System.out.println("hello world"));
要接收这个 Lambda 表达式,需要选择(偶尔可能需要提供)一个函数式接口。
public static void repeat( int n, Runnable action){
for (int i=0l i<1n; i++) action.run();
}
函数式接口 | 参数类型 | 返回类型 | 抽象方法名 | 描述 | 其他方法 |
---|---|---|---|---|---|
Runnable | 无 | void | run | 作为无参数或返回值的动作运行 | |
Supplier | 无 | T | get | 提供一个T类型的值 | |
Consumer | T | void | accept | 处理一个T类型的值 | andThen |
BiComsumer <T, U> | T, U | void | accept | 处理T和U类型的值 | andThen |
Function<T, R> | T | R | apply | 有一个T类型参数的函数 | compose, andThen, identity |
BiFunction<T, U, R> | T, U | R | apply | 有T和U类型参数的函数 | andThen |
UnaryOperator | T | T | apply | 类型T上的一元操作符 | compose, andThen, identity |
BinaryOperator | T, T | T | apply | 类型T上的二元操作符 | andThen, maxBy, minBy |
Predicate | T | boolean | test | 布尔值函数 | and, or, negate, isEqual |
BiPredicate<T, U> | T, U | boolean | test | 有两个参数的布尔值函数 | and, or, negate |