我在" Java SE 8 for the Really Impatient:Programming with Lambdas "中进行了一个例子.
让我们看一个简单的例子.假设您记录一个事件:
Run Code Online (Sandbox Code Playgroud)logger.info("x: " + x + ", y: " + y);如果将日志级别设置为禁止INFO消息会发生什么?计算消息字符串并将其传递给info方法,然后该方法决定将其丢弃.如果字符串连接仅在必要时发生,那不是更好吗?
仅在必要时运行代码是lambda的用例.标准习惯用法是将代码包装在无参数lambda中:
Run Code Online (Sandbox Code Playgroud)() -> "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()); }我们使用类的
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有什么用?