Java 8 Lambda 表达式 & 惰性求解
2019-02-28 本文已影响0人
artcccj
1. Lambda Expression
1.1 表现形式
Lambda 是一段代码块,是一个没有名字的函数。可以作为一个参数传递,其定义的是一个行为,而不是传统理解的是一个对象(匿名内部类)。Lambda有以下几种形式:
- 代码块
Runnable r = () -> {
// do something
System.out.println("This is a Lambda!");
}
- 一句简单的代码
Runnable r = () -> System.out.println("This is a simple Lambda!");
- 一个表达式
BiFunction<Integer, Integer, Integer> f = (a, b) -> a + b; // return a + b;
// or
BiFunction<Integer, Integer, Integer> f = (Integer a, Integer b) -> a + b;
- 某些复杂的场景下Java编译器可能不能准确的推断出参数类型,需要我们指定参数类型
@Test
public void test() {
List<Person> list = Lists.newArrayList(Person.builder().age(10).build(),
Person.builder().age(23).build());
// 以下代码编译失败: Cannot resolve method 'getAge()'
list.stream().sorted(Comparator.comparing(p -> p.getAge()).reversed());
// 可写为
list.stream().sorted(Comparator.comparing(
(Person p) -> p.getAge()).reversed()
); // 强制指定参数类型
// 或者 Person::getAge ‘::’ 是Java新引入的运算符,用于获取方法函数
list.stream().sorted(Comparator.comparing(Person::getAge).reversed());
}
@Data
@Builder
public static class Person {
private String name;
private Integer age;
}
- 当函数只有一个参数时可省略函数的()
@Test
public void test() {
List<Person> list = Lists.newArrayList(Person.builder().age(10).build(),
Person.builder().age(23).build());
list.stream().sorted(Comparator.comparing((p) -> p.getAge()));
// or
list.stream().sorted(Comparator.comparing(p -> p.getAge()));
}
1.2 惰性求解
惰性求解,即是延迟求解,在真正需要执行的时候才执行。常用场景: a. 非 A 则 B ;b. 获取默认值
例: 根据日志级别打印日志
if (log.isInfoEnabled()) {
log.info("the info log");
}
在调试阶段可能需要打印非常多的日志帮助排查问题,调试完成之后又需要删除这些代码一面产生过多的性能消耗,虽然Java的GC做得越来越好,越来越快。但是有些业务日志是真的很大(PS:比如一个List,Map,恩~很常见),这个时候惰性求解就很有必要了。
// 模拟配置的日志级别
private static final boolean isInfoEnable = true;
@Test
public void test() {
LoggerUtils.info(() -> {
// 方便查看执行结果
log.info("executed logContent()");
return "this is the log";
});
// 最终打印日志的结果应该是这样的, 虽然写起来稍微有点怪异,但是我认为是值得的
LoggerUtils.info(() -> "this is the log");
}
public static class LoggerUtils {
public static void info(LogHolder holder) {
if (isInfoEnable) {
log.info(holder.content());
}
}
public interface LogHolder {
String content();
}
}