Java学习笔记40——Lambda表达式

2023-09-20 22:15:06

Lambda表达式

函数式编程思想概述

面向对象思想强调“必须通过对象的形式做事”
在函数式思想中尽量忽略面向对象的复杂语法:“强调做什么,而不是什么形式做”

Lambda表达式的标准格式

  • ()里面为空,可以看成是方法的形参为空
  • -> 用箭头指向后面要做的事
  • {} 包含一段代码,称为代码块,可以看成是方法体中的内容
    三要素:形式参数、箭头、代码块
    (形式参数)->{代码块}

Lambda表达式练习

Lambda表达式使用的前提条件

  • 有一个接口
  • 接口中有且仅有一个抽象方法

练习1

  • 定义一个接口(Eatable),里面定义一个抽象方法: void eat()
  • 定义一个测试类(EatableDemo),在测试类中提供两个方法
    • 一个 方法是:useEatable(Eatable e)
    • 一个方法是主方法,在主方法中调用useEatable方法

创建接口

public interface Eatable {
    void eat();
}

创建实现类

public class EatableImpl implements Eatable{
    @Override
    public void eat(){
        System.out.println("CC吃我的屎!");
    }
}

创建测试类

public class EatableDemo {
    public static void main(String[] args){
    	//实现类
        Eatable e=new EatableImpl();
        useEatable(e);

		//匿名内部类
		useEatable(new Eatable() {
            @Override
            public void eat() {
                System.out.println("CC吃我的屁!");
            }
        });
        //Lambda表达式
        useEatable(()->{
            System.out.println("CC吃我的大便!");
        });
    }
    private static void useEatable(Eatable e){
        e.eat();
    }
}

练习2

  • 定义一个接口(Flyable),里面定义一个抽象方法: void fly(String s)
  • 定义一个测试类(FlyableDemo),在测试类中提供两个方法
    • 一个是useFlyable(Flyable f)
    • 一个是主方法调用useFlyable方法
      定义接口
public interface Flyable {
    void fly(String s);
}

测试类

public class FlyableDemo {
    public static void main(String[] args){
        //匿名内部类
        useFlyable(new Flyable() {
            @Override
            public void fly(String s) {
                System.out.println(s);
                System.out.println("把CC屁股打烂!");
            }
        });
        //Lambda
        useFlyable((String s)->{
            System.out.println(s);
            System.out.println("把CC活打死!");
        });
    }
    private static void useFlyable(Flyable f){
        f.fly("飞飞飞");
    }
}

练习3

  • 定义一个Addable接口,里面定义一个抽象方法:int add(int x,int y)
  • 定义一个AddableDemo测试类包含
    • useAddable(Addable a)
    • 主方法调用useAddable

创建接口

public interface Addable {
    int add(int x,int y);
}

测试类

public class AddableDemo {
    public static void main(String[] args) {
        useAddable((int x,int y)->{
            return x+y;
        });
    }
    private static void useAddable(Addable a){
        int res=a.add(10,20);
        System.out.println(res);
    }
}

Lambda表达式的省略模式

  • 参数的类型可以省略,有多个不能只省略一个
  • 如果参数有且仅有一个,小括号可以省略
  • 如果代码块只有一行,可以省略大括号和分号(有return也需要省略)
public class LambdaDemo {
    public static void main(String[] args) {
//        useAddable((int x,int y)->{
//            return x+y;
//        });
        //参数的类型可以省略,不能只省略一个
        useAddable((x, y)->{
            return x+y;
        });
        //如果参数有且仅有一个,小括号可以省略
        useFlyable(s->{
            System.out.println(s);
            System.out.println("把CC活打死!");
        });
        //如果代码块只有一行,可以省略大括号和分号(有return也需要省略)
        useFlyable(s-> System.out.println(s));
    }
    public static void useFlyable(Flyable f){
        f.fly("飞飞飞");
    }
    private static void useAddable(Addable a){
        int res=a.add(10,20);
        System.out.println(res);
    }
}

Lambda表达式的注意事项

  • 必须要有接口,并且接口中有且只有一个抽象接口
  • 必须有上下文环境,才能推导出Lambda接口
    • 根据局部变量的赋值得知lambda对应的接口:Runnable r=()->System.out.println(“Lambda表达式”);
    • 根据调用方法的参数得知lambda对应的接口:new Thread(()->System.out.println(“Lambda表达式”)).start();

Lambda表达式与接口的区别

所需类型不同

  • 匿名内部类:可以是接口也可以是抽象类,还可以是具体类
  • Lambda表达式:只能是接口
    使用限制不同
  • 如果接口中有且只有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
  • 如果接口中多于一个抽象方法,只能用匿名内部类,不能用Lambda表达式
    实现原理不同
  • 匿名内部类编译后,产生一个单独的.class字节码文件
  • Lambda编译之后没有单独的.class字节码文件。对用的字节码会在运行的时候动态生成
更多推荐

钉钉旧版服务端SDK支持异步方法的升级改造

最近项目中需要对接钉钉,有些钉钉API的访问需要使用旧版服务端SDK才能搞定,但是这个SDK使用的还是.NETFramework2.0框架,不能跨平台部署,也不支持async\await的异步操作方法,Nuget上也有其它用户改造的.NETCore版本,但是都不支持异步方法,于是就想自己改造一下,经过若干小时的改造,最

Stable Diffusion 系统教程 | 强大的ControlNet 控制网

2023年的2月13日,一款名叫ControlNet的插件横空出世,AI绘画变得更加可控ControlNet直译过来很简单,就叫做控制网,开发者是一名华裔,毕业于苏州大学,目前在斯坦福做读博士一年级,大佬大佬!在controlNet之前,基于扩散模型的绘画是极为难控制的,平时自嗨画画其实没有一点问题,随机就随机一点,但

Java 中的四种引用方式

文章目录Java中的四种引用方式1、强引用(StrongReference)(1)弱化方式1(2)弱化方式22、软引用(SoftReference)3、弱引用(WeakReference)4、虚引用(PhantomReference)Java中的四种引用方式1、强引用(StrongReference)强引用是最普遍的引

【Python】Python 模式匹配与正则表达式

Python模式匹配与正则表达式1.模式匹配与正则表达式你可能熟悉文本查找,即按下Ctrl-F,输入你要查找的词。“正则表达式”更进一步,它们让你指定要查找的“模式”。你也许不知道一家公司的准确电话号码,但如果你住在美国或加拿大,你就知道它有3位数字,然后是一个短横线,然后是4位数字(有时候以3位区号开始)。因此作为一

Android SurfaceFlinger导读(02)MessageQueue

该系列文章总纲链接:AndroidGUI系统之SurfaceFlinger系列文章目录说明:关于导读:导读部分主要是方便初学者理解SurfaceFlinger代码中的机制,为后面分析代码打下一个更好的基础,这样就可以把更多的精力放在surfaceFlinger的业务逻辑分析上。关于代码分支:以下代码分析均在androi

单元测试框架-pytest

单元测试框架-pytest官网常用插件pytest-html:生成html报告pytest-xdist:实现并发测试pytest-ordering:实现测试用例顺序设置pytest-rerunfailures:测试用例失败重试allure-pytest:生成测试报告引入依赖在项目根目录下创建:requirements.

RK3568开发笔记(七):在宿主机ubuntu上搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试

若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/132733901红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…瑞芯微开

Docker和debezium是什么关系,如何部署?

目录一、什么是Docker二、什么是debezium一、什么是DockerDocker是一种开源的容器化平台,用于构建、部署和运行应用程序。它通过将应用程序及其依赖项打包到一个称为容器的独立单元中,使应用程序能够在不同的环境中以一致的方式运行。以下是Docker的一些核心概念和特性:容器:Docker使用容器来封装应用

RK3568开发笔记(十):开发板buildroot固件移植开发的应用Demo,启动全屏显示

若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/133021990红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…瑞芯微开

AI实战营第二期 第六节 《MMDetection代码课》——笔记7

文章目录什么是MMDetection?环境检测和安装1数据集准备和可视化2自定义配置文件3训练前可视化验证4模型训练5模型测试和推理6可视化分析MMYOLO环境和依赖安装特征图可视化1.可视化backbone输出的3个通道2.可视化neck输出的3个通道Grad-BasedCAM可视化检测新趋势总结什么是MMDetec

开始在 Windows 上将 Python 用于脚本和自动化

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录设置开发环境安装Python安装VisualStudioCode安装MicrosoftPython扩展在VSCode中打开集成PowerShell终端安装Git(可选)用于显示文件系统目录结构的示例脚本用于修改

热文推荐