您当前的位置: 首页 >  Java

星许辰

暂无认证

  • 0浏览

    0关注

    466博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java基础——Lambda表达式

星许辰 发布时间:2021-08-25 21:51:02 ,浏览量:0

目录
  • 1.Lambda 表达式概述
  • 2.体验 Lambda 表达式
  • 3.Lambda表达式的标准格式
  • 4.使用 Lambda 表达式
  • 5.Lambda 表达式的省略规则
  • 6.Lambda 表达式与匿名内部类的区别

本文章的大部分笔记整理来自https://www.bilibili.com/video/BV12k4y1q73J?p=240

1.Lambda 表达式概述

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。

2.体验 Lambda 表达式

(1)需求:

  • 已知接口 Animal 中有一个抽象方法 eat()
  • 在测试类 AnimalTest 中定义 show(Animal an) 方法, 实现调用 Animal#eat() 方法;
  • 并在 main 方法中, 调用 AnimalTest#show() 方法;

(2)代码实现

package jf_lambda;

//自定义接口
public interface Animal {
    
    void eat();
    
}
package jf_lambda;

public class Cat implements Animal {
    @Override
    public void eat() {
        System.out.println("eat!");
    }
}
package jf_lambda;

public class AnimalTest {

    //实现调用Animal#eat()方法
    public static void show(Animal animal){
        animal.eat();
    }
    
    public static void main(String[] args) {
        //在 main 方法中调用 AnimalTest#show() 方法
        
        //方式一:创建对象继承接口 Animal,并实现 eat() 方法
        show(new Cat());
        
        //方式二:采用匿名内部类,体现的是面向对象的思想,即传入 Animal 接口的子类对象
        show(new Animal() {
            //重写抽象方法
            @Override
            public void eat() {
                System.out.println("eat!");
            }
        });
        
        //方式三:采用 Lambda 表达式,体现的是函数式编程思想
        show(() -> {
            System.out.println("eat!");
        });
    }

}
3.Lambda表达式的标准格式

(1)标准格式:(形式参数) -> {代码块}

(2)格式解释:

形式参数如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可->由英文中画线和大于符号组成,固定写法,代表指向动作代码块具体要做的事情,也就是以前我们写的方法体内容

组成 Lambda 表达式的三要素:形式参数,箭头,代码块

(3)使用 Lambda 表达式的前提是有一个接口,且接口中有且仅有一个抽象方法。

4.使用 Lambda 表达式

(1)无参无返回值的抽象方法

package jf_lambda;

public interface Eatable {
	//无参无返回值的抽象方法
    void eat();
}
package jf_lambda;

public class EatableTest {
    
    public static void useEatable(Eatable eatable){
        eatable.eat();
    }
    
    public static void main(String[] args) {
        //将 Lambda 表达式当作方法的实参进行传递
        useEatable(()->{
            System.out.println("无参无返回值!");
            System.out.println("eat!");
        });
    }
}

(2)有参无返回值的抽象方法

package jf_lambda;

public interface Flyable {    
    //有参无返回值的抽象方法
    void fly(String s);
}
package jf_lambda;

public class FlyableTest {
    
    public static void useFlyable(Flyable flyable){
        flyable.fly("fly!");
    }
    
    public static void main(String[] args) {
        useFlyable((String s)->{
            System.out.println("有参无返回值的抽象方法。");
            System.out.println("传入的参数为:" + s);
        });
    }
}

(3)有参有返回值的抽象方法

package jf_lambda;

//自定义接口,具有求和功能
public interface Addable {
    int add(int a,int b);
}
package jf_lambda;

public class AddableTest {
    
    public static void useAddable(Addable addable){
        int sum = addable.add(10,20);
        System.out.println(sum);
    }
    
    public static void main(String[] args) {
        useAddable((int a, int b)->{
            System.out.println("有参有返回值的抽象方法。");
            return a + b;
        });
    }
}
5.Lambda 表达式的省略规则

(1)参数类型可以省略但是有多个参数的情况下,不能只省略一个。 (2)如果参数有且仅有一个,那么小括号可以省略。 (3)如果代码块的语句只有一条,可以省略大括号、分号以及 return 关键字。 示例代码如下:

package jf_lambda;

public class OmitModeTest {
    
    public static void useEatable(Eatable eatable){
        eatable.eat();
    }
    
    public static void useFlyable(Flyable flyable){
        flyable.fly("fly!");
    }
    
    public static void useAddable(Addable addable){
        int sum = addable.add(10,20);
        System.out.println(sum);
    }
    
    public static void main(String[] args) {
    	//按照上述的三条省略规则对Lambda表达式进行简写
        useEatable(() -> System.out.println("eat!"));
        useFlyable(s -> System.out.println("传入的参数为:"+s));
        useAddable((a,b)->a+b);
    }
}
6.Lambda 表达式与匿名内部类的区别 Lambda表达式匿名内部类所需类型只能是接口可以是接口、抽象类或者具体类使用限制如果接口中有且仅有一个抽象方法,Lambda 表达式和匿名内部类都可以使用如果接口中有多个抽象方法,只能使用匿名内部类实现原理编译之后,没有单独的 .class 字节码文件,它会在运行的时候动态生成编译之后,会产生一个单独的 .class 字节码文件
关注
打赏
1665627467
查看更多评论
立即登录/注册

微信扫码登录

0.0717s