Lambda

img编辑

一、概述

  • Lambda表达式是java对函数接口实现类对象的一种简化形式,本质是一个值(必须使用变量存储之后才能存在),在java中主要是体现在对特殊的匿名内部类对象的一种表示(就是对匿名内部类对函数式接口实现的简化),代表都是函数式接口的匿名内部类的对象。

  • 简单理解:Lambda表达式是对接口匿名内部类格式的一种简化,但是本质不一样。都是匿名内部类对象,但是匿名内部类对象是一个进行单独编译,创建的对象,Lambda表达式不会单独编译,本质是值。值表示了匿名内部类的对象。

二、前提

  • 有且只有一个抽象方法的接口,函数式接口

  • 必须要有上下文推断,根据接口中抽象方法进行Lambda表达式的书写。

三、格式

(一)标准格式

三个一:一个小括号、一个箭头、一个花括号

(参数列表)—> {执行代码块}

(二)格式解释

(参数列表): 里面写实现的函数式接口中的抽象方法的参数。【就是接口抽象方法的参数列表】 ->: 原封不动。 他是lambda表达式的标志,Lambda运算符,也可以叫"箭头运算符"。 {执行代码段}:lambda表达式对接口抽象方法的重写,,相当于之前重写抽象的方法体.。也称之为lambda体。

(三)语法格式

1、没有参数,没有返回值

()——> System.out.println(“Hello Lambda”);

注意:没有参数小括号不能省略。

2、有一个参数,没有返回值

X ——> System.out.println("你好"+X);

注意:如果只有一个参数,小括号可以省略,可以省略参数类型

3、有多个参数,没有返回值

(x,y)——> System.out.println(x+y);

注意:不能省略小括号,但依然可以省略参数类型

4、无参数,有返回值

()——> {return "HelloWorld"}

()——> "HelloWorld"

注意:Lambda体只有一条语句,可以省略大括号同时也要省略return关键词

5、有参数,有返回值

(x,y)——> {return x > y?x:y};

(x,y)——>x>y?x:y;

四、结论

Lambda表示式就是得到函数式接口实现类对象的另一种体现。

函数式接口实现方式有:

1、定义实现类创建对象

2、匿名内部类

3、Lambda表达式

五、代码示例

无参无返的Lambda表达式

public class UseLambda {
    public static void main(String[] args) {
        // 匿名内部类对Inter1函数式接口提供实现
        Inter1 imp1 = new Inter1() {
            @Override
            public void eat() {
                System.out.println("吃炸鸡喝啤酒");
            }
        };
        imp1.eat();
​
// Lambda对Inter1函数式接口体统实现类对象
// Lambda对那种类型的函数式接口体现实现类,就定义那种接口类型的变量存储Lambda表达式
/*
(参数列表):里面写实现的函数式接口中的抽象方法的参数.【就是接口抽象方法的参数列表】
->:原封不动 他是lambda表达式的标志,Lambda运算符,也可以叫"箭头运算符"
{执行代码段}:lambda表达式对接口抽象方法的重写, 相当于之前重写抽象的方法体. 也称
之为lambda体.
*/
​
        // 无参数无返回值的Lambda表达式
        Inter1 imp2 = () -> {
            System.out.println("Lambda....吃炸鸡喝啤酒");
        };
        imp2.eat();
    }
}
​
@FunctionalInterface
interface Inter1 {
    // 无参数无返回值的抽象方法
    public abstract void eat();
}

有一个参数无返回值的Lambda表达式

public class UseLambda2 {
    public static void main(String[] args) {
        // 匿名内部类对Inter2函数式接口提供实现类
        Inter2 imp1 = new Inter2() {
            @Override
            public void show(String name) {
                System.out.println("匿名内部类----"+name);
            }
        };
​
        imp1.show("tom");
        // Lambda表达式对Inter2函数式接口提供实现类
        Inter2 imp2 = (String name) -> {
            System.out.println("Lambda---"+name);
        };
​
        imp2.show("rose");
        // Lambda表达式中参数列表可以省略数据类型
        Inter2 imp3 = (name)->{
            System.out.println("参数省略数据类型的Lambda表达式----"+name);
        };
​
        imp3.show("jack");
        // Lambda表达式中有且只有一个参数的时候,可以省略小括号, 参数名可以不合抽象方法一样
        Inter2 imp4 = a->{
            System.out.println("省略小括号的Lambda表达式----"+a);
        };
​
        imp4.show("lucy");
        // Lambda中如果Lambda体中有且只有一句java代码,省略大括号
        Inter2 imp5 = name-> System.out.println("省略大括号的Lambda表达式---"+name);
            imp5.show("lilei");
        }
}
​
@FunctionalInterface
interface Inter2 {
    // 有一个参数,无返回值的抽象方法
    public abstract void show(String name);
}

多个参数无返回值Lambda表达式

public class UseLambda1 {
    public static void main(String[] args) {
        // 匿名内部类实现Inter1接口
        Inter1 imp1 = new Inter1() {
            @Override
            public void printSum(int a, int b) {
                System.out.println(a+b);
            }
        };
​
        imp1.printSum(10, 20);
        // Lambda实现Inter1接口 Lambda实现多个参数无返回值的方法
        Inter1 imp2 = (int a, int b) -> {
            System.out.println(a+b);
        };
​
        imp2.printSum(20, 30);
        // 多个参数是不能省略小括号,但是依然可以省略参数类型
        Inter1 imp3 = (a, b)-> System.out.println(a+b);
        imp3.printSum(10, 100);
​
System.out.println("====================================");
​
        // 匿名内部类可以对非函数式接口提供实现
        Inter2 imp4 = new Inter2() {
            @Override
            public void eat() {
                System.out.println("吃东西");
            }
​
            @Override
            public void drink() {
                System.out.println("喝东西");
            }
        };
        imp4.eat();
        imp4.drink();
        // Lambda只能对函数式借口提供实现类对象
        /* Inter2 imp5 = () -> {
    
        };*/
    }
}
​
@FunctionalInterface
interface Inter1 {
    // 多个参数没有返回值的抽象方法
    public abstract void printSum(int a, int b);
}
interface Inter2 {
    public abstract void eat();
    public abstract void drink();
}

无参数有返回值的Lambda表达式

​
public class UseLambda2 {
    public static void main(String[] args) {
        // 匿名内部类对Inter3提供实现
        Inter3 imp1 = new Inter3() {
            @Override
            public int getRandomInt() {
                Random r = new Random();
                return r.nextInt(100);
            }
        };
        int r = imp1.getRandomInt();
        System.out.println(r);
​
        // Lambda提供Inter3的实现对象
        // Lambda实现接口中带有返回值的抽象法Lambda体中也要有return语句
        Inter3 imp2 = () -> {
            Random ran = new Random();
            return ran.nextInt(200);
        };
        System.out.println(imp2.getRandomInt());
​
        // 如果带有返回值的Lambda体(大括号)只有一条语句.可以省略大括号,但是同时也要把return关键字省掉.
        Inter3 imp3 = ()-> new Random().nextInt(50);
        int r2 = imp3.getRandomInt();
        System.out.println(r2);
    }
}
​
@FunctionalInterface
interface Inter3 {
    public abstract int getRandomInt();
}


​

有参数有返回值的Lambda表达式

public class UseLambda3 {
    public static void main(String[] args) {
        // 匿名内部类提供Inter4的实现对象
        Inter4 imp1 = new Inter4() {
            @Override
            public int useTwoNumber(int a, int b) {
                return a > b ? a : b;
            }
        };
        int r1 = imp1.useTwoNumber(10, 20);
        System.out.println(r1);
​
        // Lambda提供Inter4的实现对象
        Inter4 imp2 = (int a, int b) -> {
            return a > b ? a : b;
        };
        System.out.println(imp2.useTwoNumber(100, 200));
        // 简化Lambda表达式
        Inter4 imp3 = (a, b) -> a > b ? a : b;
        System.out.println(imp3.useTwoNumber(10, 5));
    }
}
​
@FunctionalInterface
interface Inter4 {
    // 有参数有返回值的抽象方法
    public abstract int useTwoNumber(int a, int b);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网底层民工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值