• Java8新特性之Lambda表达式


    一、Lambda表达式概述

    Lambda表达式是Java8推出的新特性,是函数式编程的一种实现。通过配合函数式接口,可以使代码更加的简洁、明了,同时可以有效地减少代码量。Lambda通常用在需要使用匿名内部类的地方。Lambda表达式的主要目的就是突出对象的操作和行为,而简化其它不必要的步骤。它的一般形式如下:

    List<String> list = Arrays.asList("A", "B", "C");
    list.forEach(e -> System.out.println(e));
    

    二、使用Lambda表达式

    Java8中有一个forEach方法用来遍历集合中的元素,在未使用Lambda表达式时我们需要这样使用:

    list.forEach(new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }
    });
    

    可以看出forEach方法需要传入一个对象作为参数,这个对象需要实现Consumer接口,在没有使用Lambda表达式时,我们需要将整个的匿名类写出来,代码不够简洁。

    1.Lambda表达式的第一种形式

    list.forEach((String t) -> {
        System.out.println(t);
    });
    

    可以看出,这种方式展现了Lambda的一般化形式,(String t)表示匿名内部类中的方法的参数(在Java8新特性之接口中我们提到过函数式接口中只有一个抽象方法)以及参数类型,->可以看作是Lambda特有的表达式,用来将参数和代码逻辑连接起来。{}中则是代码逻辑。

    2.Lambda表达式的简化模式

    在1中我们探讨了Lambda表达式的通用模式,但是使用起来还有有点复杂,那么接下来我们继续简化Lambda。

    在Java8中添加了类型推断的特性,通过这一特性,我们就无需写出参数的类型,这一工作将交给编译器来完成。

    list.forEach((t) -> {
        System.out.println(t);
    });
    

    在只有一个参数的情况下,()也可以去掉

    list.forEach( t -> {
        System.out.println(t);
    });
    

    在代码逻辑较为简单时,我们也可以这样写

    list.forEach(t -> System.out.println(t));
    

    3.拥有返回值的Lambda表达式

    list.sort(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return 0;
        }
    });
    

    Java的List集合中有一个sort方法,它的参数是Comparator对象,里面的compare方法需要返回一个int类型的值。在拥有返回值的情况下,Lambda表达式如何处理呢?

    list.sort((e,t) ->{
        return e.compareTo(t)
    });
    

    通常情形下,我们可以这样写。但是当代码逻辑较为简单时,比如上述情形,我们可以进一步简化

    //注意这种形式,不能加return关键字,return只能在代码块{}中加
    list.sort((e,t) ->e.compareTo(t));
    

    Java编译器会进行自动类型推断,这种情形下,不需要也不能加return

    注意:拥有两个以上参数的时候需要写成(e,t,...)这种形式

    三、Lambda表达式的实际应用案例

    1.创建线程对象

    传统方式

    new Thread(new Runnable(){
        @Override
        public void run() {
            System.out.println("hello");
        }
    }).start();
    

    Lambda表达式

    new Thread(() -> System.out.println("hello")).start();
    

    2.数组排序

    传统方式

    String[] str = {"A","BB","C"};
    Arrays.sort(str, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.length() - o2.length();
        }
    });
    

    Lambda表达式

    Arrays.sort(str,  (o1,o2) -> o1.length() - o2.length());
    
  • 相关阅读:
    Linux安装MySql
    Tomcat9配置SSL证书
    Linux安装Tomcat
    VMware安装Centos8
    Linux安装JDK
    mysql中utf8和utf8mb4区别
    MVVM模式
    深入浅析Node.js单线程模型
    同步异步阻塞非阻塞
    v-model
  • 原文地址:https://www.cnblogs.com/zwscode/p/14284079.html
Copyright © 2020-2023  润新知