Lambda表达式

Lambda表达式

什么是λ表达式

面向对象过分强调“必须通过对象的形式来做事情”,于是经常看到这样的写法:
如果你想写一个方法,那么就必须把它放到一个类里面,然后new出来对象,对象调用这个方法。
这种方式在函数式编程语言看来太死板。

Lambda表达式即函数式编程,
在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。

函数式编程思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。

Lambda的格式

Lambda表达式的标准格式为
(参数列表) -> { 方法体 }
Lambda表达式的三个组成部分:
(参数列表) : 方法的参数列表,如果方法没有参数,括号为空()
-> 固定写法
{方法体} 方法体的实现代码
好处:不用写匿名内部类,不用重写方法。只有方法体。

Lambda的使用前提

使用Lambda表达式的前提,接口中只能有一个抽象方法。

Lambda省略格式

1)  方法中的参数类型可以省略

2)  如果方法的参数只有一个,小括号也可以省略

3)  如果方法体仅有一条语句,大括号,如果有返回值return可以省略,分号可以括号。

Lambda格式小结:

λ表达式本质上是一个匿名方法。

假如有一个接口中有int add(int m,int n)方法,实现类中的方法如下:

int add(int m, int n) {
return m+n;
}

转成λ表达式后是完整的写法:

(int m, int n) -> {return m+n;}

参数类型可以省略,Java编译器会根据上下文推断出来,返回值:

(m,n) -> {return m+n;}

因为方法体只有一条语句,可以省略return、大括号和分号

(m,n) -> m+n

如果只有一个参数,则小括号也可以省略,比如方法:

int getNum(int num) {
    return num + 5;
}

Lambda的写法:

num -> num+5

Lambda基本使用

Lambda本质上是一个接口的实现类
无参无返回值

需求说明

1) 给定一个接口,内含唯一的方法,且无参数、无返回值。

2) 在main函数中,直接实例化接口,使用匿名内部类,实现方法

3) 使用Lambda的实例化对象,调用方法

案例代码:

//1)给定一个Print接口,内含唯一的方法print(),且无参数、无返回值。

interface Print{

    void print();

}

public static void main(String[] args) {

//2)    在main函数中,直接实例化Print接口,使用匿名内部类,实现print()方法,输出:Hello world !

    Print p1 = new Print() {

        @Override

        public void print() {

            System.out.println("Hello world !");

        }
    };

    //调用接口中的方法

    p1.print();

//3)    使用Lambda的实例化Print对象,调用print()方法,输出:Hello world !

    Print p2 = () -> System.out.println("Hello world !");

    p2.print();

}

有参有返回值

​ 案例需求

1) 给定一个计算器Calculator接口,内含抽象方法int cal(int a, int b) 将两个int数字相加得到和并且返回。

2) 创建类和main函数

3) 使用匿名内部类实例化对象c1,并且调用cal()方法输出结果。

4) 使用Lambda实例化对象c2,并且调用cal()方法输出结果。

案例代码

//1)    给定一个计算器Calculator接口

interface Calculator {

    //内含抽象方法int cal(int a, int b) 将两个int数字相加得到和并且返回。

    int calc(int a, int b);

}

 

public class Demo {

    // 2)   创建类和main函数

    public static void main(String[] args) {

    //     3)   使用匿名内部类实例化对象c1,并且调用cal()方法输出结果。

        Calculator c1 = new Calculator() {

            @Override

            public int cal(int a, int b) {

                return a + b;

            }

        };

        //调用接口中的方法

        System.out.println(c1.cal(3, 5));

    //   4) 使用Lambda实例化对象c2,并且调用cal()方法输出结果。

        Calculator c2 = (a, b) -> a + b;

        System.out.println(c2.cal(3, 5));

    }

}

基本使用小结

Lambda其实是对一段方法中的行为进行传递,即将方法体做为参数传递。

它对匿名内部类的编写方式进行了优化,以前使用匿名内部类写的代码既难看,又冗长。

Lambda让这种代码变得更加简洁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值