浅谈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