java惰性函数_Java 8 Lambda 表达式 惰性求解

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 f = (a, b) -> a + b; // return a + b;

// or

BiFunction f = (Integer a, Integer b) -> a + b;

某些复杂的场景下Java编译器可能不能准确的推断出参数类型,需要我们指定参数类型

@Test

public void test() {

List 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 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();

}

}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部