三、使用lambda编程
3.1 延迟执行
所有lambda表达式都是延迟执行的,如果希望立即执行一段代码,则没必要使用lambda表达式
延迟执行代码原因可能有:
·在另一个线程中运行代码
·多次运行代码
·在某个算法的正确时间点上运行代码
·在某些情况发生时运行代码(如按钮点击、数据到达)
·只有在需要时运行代码
例如:
public static void info(Logger logger, Supplier<String> message) {
if (logger.isLoggable(Level.Info))
logger.info(message.get());
}
logger.info(() -> 一些运算);
只有当条件符合时,运算才会被执行。
3.2 选择lambda表达式的参数
一般来说,在设计算法时,希望将所需信息作为参数传递进逻辑。
如果需要在lambda表达式执行时捕获传入的参数,可以选择IntConsume等接口
例如:
public static void repeat(int n, IntConsumer action) {
for(int i=0; i<n; i++) action.accept(i);
}
如果不需要参数,可以考虑以下写法
public static void repeat(int n, Runnable action) {
for ( int i=0; i<n; i++) action.run();
}
repeat(10, () -> System.out.println("Hello, World!"));
3.3 选择一个函数式接口
Table 3-1 Common Functional Interfaces
Functional Interface |
Parameter Types |
Return Type |
Abstract Method Name |
Description |
Other Methods |
Runnable |
none |
void |
run |
Runs an action without arguments or return value |
|
Supplier<T> |
none |
T |
get |
Supplies a value of type T |
|
Consumer<T> |
T |
void |
accept |
Consumes a value of typeT |
chain |
BiConsumer<T, U> |
T, |