美文网首页
Java 8 Lambda 表达式 & 惰性求解

Java 8 Lambda 表达式 & 惰性求解

作者: artcccj | 来源:发表于2019-02-28 23:10 被阅读0次

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

    相关文章

      网友评论

          本文标题:Java 8 Lambda 表达式 & 惰性求解

          本文链接:https://www.haomeiwen.com/subject/lmiluqtx.html