任何人都可以解释这句话 - "所有lambdas的要点都是延期执行"

Pri*_*nka 2 java java-8

我在" Java SE 8 for the Really Impatient:Programming with Lambdas "中进行了一个例子.

让我们看一个简单的例子.假设您记录一个事件:

logger.info("x: " + x + ", y: " + y);
Run Code Online (Sandbox Code Playgroud)

如果将日志级别设置为禁止INFO消息会发生什么?计算消息字符串并将其传递给info方法,然后该方法决定将其丢弃.如果字符串连接仅在必要时发生,那不是更好吗?

仅在必要时运行代码是lambda的用例.标准习惯用法是将代码包装在无参数lambda中:

() -> "x: " + x + ", y: " + y
Run Code Online (Sandbox Code Playgroud)

以下方法提供了延迟日志记录:

public static void info(Logger logger, Supplier<String> message) {
if (logger.isLoggable(Level.INFO))
  logger.info(message.get());
}
Run Code Online (Sandbox Code Playgroud)

我们使用类的isLoggable方法Logger来决定是否应该记录INFO消息.如果是这样,我们通过调用它的抽象方法调用lambda,该方法恰好称为get.

所以我不明白的是 - 我们可以使用logger.isLoggable(Level.INFO)示例1中的代码(不使用lambdas的代码),只有logger.isLoggable(Level.INFO)满足时才会计算消息字符串.

logger.info("x: " + x + ", y: " + y);
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用lambdas有什么用?

Eug*_*ene 5

据我所知,这完全是关于Supplier你推迟执行的方式.更好的例子IMO将是Optional两种方法:orElseorElseGet.

orElse返回T或在您的示例中返回String; 另一方面orElseGet返回a Supplier<T>,仅在需要时计算(当Optional实际丢失时):

public T orElseGet(Supplier<? extends T> supplier) {
    return value != null ? value : supplier.get();
}
Run Code Online (Sandbox Code Playgroud)

这里的区别在于总是orElse计算价值,有点急切 ; 即使它不需要.