浅谈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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值