Java 8 Lambda 表达式 & 惰性求解

2019-02-28  本文已影响0人  artcccj

1. Lambda Expression

1.1 表现形式

Lambda 是一段代码块,是一个没有名字的函数。可以作为一个参数传递,其定义的是一个行为,而不是传统理解的是一个对象(匿名内部类)。Lambda有以下几种形式:

  1. 代码块
Runnable r = () -> {
    // do something
    System.out.println("This is a Lambda!");
}
  1. 一句简单的代码
Runnable r = () -> System.out.println("This is a simple Lambda!");
  1. 一个表达式
BiFunction<Integer, Integer, Integer> f = (a, b) -> a + b; // return a + b;
// or
BiFunction<Integer, Integer, Integer> f = (Integer a, Integer b) -> a + b;
  1. 某些复杂的场景下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;
}
  1. 当函数只有一个参数时可省略函数的()
@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();
    }

}
上一篇下一篇

猜你喜欢

热点阅读