浅谈Lambda

一、Lambda表达式简介

  1. 什么是Lambda表达式? Lambda是Java 8添加的一个新的特性。说白了,Lambda就是一个匿名函数

  2. 为什么要使用Lambda? 使用Lambda表达式可以对一个接口进行非常简洁的实现

    具体可以对比一下下面几种写法,这三种方式实现的功能完全一致

    // 测试使用的main方法
    public static void main(String[] args) {
        // 1. 使用接口的实现类
        Comparator comparator = new MyComparator();

        // 2. 使用匿名内部类
        Comparator comparator1 = new Comparator() {
            @Override
            public int compare(int a, int b) {
                return a - b;
            }
        };

        // 3. 使用Lambda表达式来实现接口
        Comparator comparator2 = (a, b) -> a - b;
        System.out.println(comparator.compare(10, 5));
        System.out.println(comparator1.compare(10, 5));
        System.out.println(comparator2.compare(10, 5));
    }

// 定义一个接口  @FunctionalInterface 修饰表名这个接口标记为方法接口,意思是标记这个接口只有一个抽象方法
@FunctionalInterface
interface Comparator {
    int compare(int a, int b);
}
// 接口的实现类
class MyComparator implements Comparator {
    @Override
    public int compare(int a, int b) {
        return a - b;
    }
}

  1. Lambda对接口的要求 接口中定义的必须要实现的接口只能有一个
    • Java 8 对接口加了一个新的特性:default

二、Lambda表达式的基础语法

具体Lambda长什么样,下面这个就是标准的Lambda构成要素

() : 用户描述参数列表

{} : 用来描述方法体

-> :Lambda运算符,读作 goes to

三、Lambda语法精简

** Lambda 也叫匿名函数的简单实现,既然匿名,我们就不会关心接口名,方法名,参数名, 我们只关心:参数的类型,参数的个数,返回值 **

  1. 参数类型: 由于接口的抽象方法中,已经定义了参数的数量和类型。所以在Lambda表达式中,参数的类型可以省略 备注:如果需要省略类型,则每个参数的类型都要省略。不能出现省略一个参数类型,不省略一个参数类型
  2. 参数小括号: 如果参数列表总,参数的数量只有一个,此时的小括号可以省略
  3. 方法大括号 如果方法体中,只有一个条语句,此时大括号可以省略
  4. 如果方法体中唯一的一条语句是一个返回语句,则在省略大括号的同时,也必须省略掉return

四、JDK内置的常见接口

TiP:一元函数表示入参只有一个,二元函数表示入参为两个

名称 一元接口 说明 二元接口 说明
一般函数 Function 一元函数,抽象apply方法 BiFunction 二元函数,抽象apply方法
算子函数(输入和输出同类型) UnaryOperator 一元算子,抽象apply方法 BinaryOpertor 二元算子,抽象apply方法
谓词函数(输出boolean) Predicate 一元谓词,抽象test方法 BiPredicate 二元谓词,抽象test方法
消费者(无返回值) Consumer 一元消费者函数,抽象accept方法 BiConsumer 二元消费函数,抽象accept方法
供应者(无参数,只有返回值) Supplier 供应者函数,抽象get方法 — —

五、方法引用

可以快速的讲一个Lambda表达式的实现指向一个已经实现的方法

语法: 方法的隶属者::方法名

注意:

1. 参数的数量和类型一定要和接口中定义的方法一致
2. 返回值类型一定要和接口中定会的方法一致

(1)静态方式的引用: (2)非静态方法(实例方法)的引用: (3)构造方法的引用:【使用 new 关键字】


public class QuoteDemo {
    public static void main(String[] args) {
        // 静态方法引用的写法
        Consumer<String> consumer = System.out::println;
        consumer.accept("Hello World : static method");
        // 静态方法 Lambda 写法
        Consumer<String> consumerLambda = s -> System.out.println(s);
        consumerLambda.accept("Hello World: static method Lambda");

        // 实例一般方法
        Quote quote = new Quote();
        Consumer<String> consumerInstance = quote::myPrintln;
        consumerInstance.accept("Hello World: instance method");


        // 构造方法方法引用--无参数
        Supplier<Quote> supplier = Quote::new;
        System.out.println(supplier.get());
    }

}

class Quote {
    // 实例方法
    public void myPrintln(String name) {
        System.out.println(name);
    }

    // 无参构造方法
    public Quote() {
    }
}

输出结果:

# 六、参考文章&视频

  1. Lambda表达式基础
  2. 两天学会Lambda