Lambda表达式第三版,从3个方面分析。(①抽象方法无参数无返回值,②抽象方法带参数无返回值,③抽象方法带参数有返回值)

news2024/11/28 18:51:52

1、函数式编程思想概述

  • 在数学中,函数就是有输入量、输出量的一套计算方案,也就是”拿数据做操作“面向对象思想强调”必须通过对象的形式来做事情“
  • 函数式思想则尽量忽略面向对象的复杂语法:”强调做什么,而不是以什么形式去做,而我们要学习的Lambda表达式就是函数式思想的体现“

1.1、体验Lambda表达式

需求:启动一个线程,在控制台输出一句话:多线程程序启动了

  • 定义一个类MyRunnable实现Runnable接口,重写run()方法
  • 创建MyRunnable类的对象
  • 创建Thread类的对象,把MyRunnable的对象作为构造参数传递
  • 启动线程

1.2、实现类的方式实现需求

package com.lambda;

public class LambdaDemo1 {

    public static void main(String[] args) {

        MyRunnable myRunnable = new MyRunnable();

        Thread thread = new Thread(myRunnable);

        thread.start();//多线程程序启动了
    }

}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("多线程程序启动了");
    }
}


1.2、匿名内部类的方式改进

package com.lambda;

public class LambdaDemo2 {
    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("多线程程序启动了");
            }
        }).start();//多线程程序启动了

    }
}

1.2、Lambda表达式的方式改进

package com.lambda;

public class LambdaDemo2 {
    public static void main(String[] args) {

//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("多线程程序启动了");
//            }
//        }).start();//多线程程序启动了


        new Thread(() -> System.out.println("多线程程序启动了")).start();//多线程程序启动了

    }
}

2、组成Lambda表达式的三要素

  • 形式参数、箭头、代码块

3、Lambda表达式的格式

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

4、Lambda表达式的使用前提

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

4.1、练习1:抽象方法无参数无返回值

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

public class EatableDemo {

    public static void main(String[] args) {

//        useEatable(new Eatable() {
//            @Override
//            public void eat() {
//                System.out.println("一天一苹果,医生远离我");
//            }
//        });

        useEatable(() -> System.out.println("一天一苹果,医生远离我"));//一天一苹果,医生远离我

    }

    public static void useEatable(Eatable e) {
        e.eat();
    }

}

interface Eatable {

    void eat();
}

4.2、练习2:抽象方法带参数无返回值

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

public class FlyableDemo {

    public static void main(String[] args) {

//        useFlyable(new Flyable() {
//            @Override
//            public void fly(String s) {
//
//                System.out.println(s + ",飞机自驾游");
//            }
//        });

//        useFlyable((String s) -> System.out.println(s + ",飞机自驾游"));

        useFlyable(s -> System.out.println(s + ",飞机自驾游"));//风和日丽,晴空万里,飞机自驾游


    }


    public static void useFlyable(Flyable f) {
        f.fly("风和日丽,晴空万里");

    }
}

interface Flyable {

    void fly(String s);
}

4.3、练习3:抽象方法带参数有返回值

  • 定义一个接口(Addable),里面定义一个抽象方法:int  add(int x,int y);
  • 定义一个测试类(AddableDemo),在测试类中提供两个方法,一个方法是:useAddable(Addable a),一个方法是主方法,在主方法中调用useAddable方法
package com.lambda;


public class AddableDemo {

    public static void main(String[] args) {

//        useAddable(new Addable() {
//            @Override
//            public int add(int x, int y) {
//                return x + y;
//            }
//        });

//        useAddable((int x, int y) -> x + y);

        useAddable((x, y )-> x + y);//30
    }

    public static void useAddable(Addable a) {
        int sum = a.add(10, 20);
        System.out.println(sum);
    }
}

interface Addable {

    int add(int x, int y);

}

5、Lambda表达式的注意事项

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

public class LambdaDemo2 {
    public static void main(String[] args) {

//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("Lambda表达式");
//            }
//        }).start();//Lambda表达式


//        new Thread(() -> System.out.println("Lambda表达式")).start();//Lambda表达式

        Runnable r = () -> System.out.println("Lambda表达式");

        new Thread(r).start();//Lambda表达式

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/968081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引

之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客 【数据库原理与应用 - 第八章】数据库的事务管理与并发控制_一级封锁协议_Roye_ack的博客-CSDN博客 目录 一、多表查询 1、概述 (1&#…

性能测试(测试系列10)

目录 前言: 1.什么是性能测试 1.1生活中遇到的软件问题 1.2性能测试的定义 1.3性能测试和功能测试有什么区别 1.4性能的好坏的区分 1.5影响一个软件性能的因素 2.为什么要进行性能测试 3.性能测试常见的术语以及衡量指标 3.1并发 3.2用户数 3.3响应时间 …

Jmeter如何设置中文版

第一步:找到 apache-jmeter-5.4.3\bin目录下的 jmeter.properties 第二步:打开 三,ctrf 输入languageen,注释掉,增加以行修改如下 四,ctrs 保存修改内容,重新打开jmeter就可以了

golang-bufio 缓冲写

1. 缓冲写 在阅读这篇博客之前,请先阅读上一篇:golang-bufio 缓冲读 // buffered output// Writer implements buffering for an io.Writer object. // If an error occurs writing to a Writer, no more data will be // accepted and all subsequent…

5.0: Dubbo服务导出源码解析

#Dubbo# 文章内容 Dubbo服务导出基本原理分析Dubbo服务注册流程源码分析Dubbo服务暴露流程源码分析服务导出的入口方法为ServiceBean.export(),此方法会调用ServiceConfig.export()方法,进行真正的服务导出。 1. 服务导出大概原理 服务导出的入口方法为ServiceBean.export…

stm32之28.ADC

须看原理图(引脚、电压值、ADC几号通道)配置 。 若对比值0~4096 模拟电压/参考电压4096/x 假设模拟电压2.1V,参考电压3.3v,4096/x3.3/2.1 ->3.3x2.1x4096 ->x2,606.5 也可反推出模拟电压 ADC转换时间 ADC时钟来源于…

leetcode645. 错误的集合(java)

错误的集合 题目描述优化空间代码演示 题目描述 难度 - 简单 LC645 - 错误的集合 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数…

时序预测 | MATLAB实现CNN-GRU卷积门控循环单元时间序列预测(风电功率预测)

时序预测 | MATLAB实现CNN-GRU卷积门控循环单元时间序列预测(风电功率预测) 目录 时序预测 | MATLAB实现CNN-GRU卷积门控循环单元时间序列预测(风电功率预测)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.时序预测 | MA…

Python中的绝对和相对导入

在本文中,我们将看到Python中的绝对和相对导入。 Python中导入的工作 Python中的import类似于C/C中的#include header_file。Python模块可以通过使用import导入文件/函数来访问其他模块的代码。import语句是调用import机制的最常见方式,但它不是唯一的…

常见数学名词的物理意义(更新中)

BetterExplained – Math lessons that click 一、复数 i 的物理意义就是旋转,i 就是逆时针旋转90,i*i 就是逆时针旋转180 加法:实部相加,虚部相加 乘法: 复数zxyi控制了函数的放缩和旋转 ——x 放缩,…

Shell开发实践:服务器的磁盘、CPU、内存的占用监控

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

基于vue-cli创建后台管理系统前端页面——element-ui,axios,跨域配置,布局初步,导航栏

目录 引出安装npm install安装element-ui安装axios 进行配置main.js中引入添加jwt前端跨域配置 进行初始布局HomeView.vueApp.vue 新增页面和引入home页面导航栏总结 引出 1.vue-cli创建前端工程,安装element-ui,axios和配置; 2.前端跨域的配…

SQL查询本年每月的数据

--一、以一行数据的形式,显示本年的12月的数据,本示例以2017年为例,根据统计日期字段判断,计算总和,查询语句如下:selectsum(case when datepart(month,统计日期)1 then 支付金额 else 0 end) as 1月, sum…

UE4 春节鞭炮

先搞个基类,一个鞭炮的 搞个鞭炮类,存多个鞭炮 在构造函数的位置先生成对应的鞭炮数 将鞭炮绑定到绳子上,随绳子摆动而一起摆动 在基类里面写爆炸事件 最后用Timer去调用

一篇文章搞懂Redis缓存

目录 一、什么是缓存缓存的优缺点缓存的优点缓存的缺点 二、Redis缓存三、缓存的更新策略主动更新策略 四、缓存穿透解决方案 五、缓存雪崩解决方案 六、缓存击穿解决方案 一、什么是缓存 我们都知道在计算机中内存的速度比磁盘要快非常多,如果每次都要去磁盘获取数…

《Python魔法大冒险》004第一个魔法程序

在图书馆的一个安静的角落,魔法师和小鱼坐在一张巨大的桌子前。桌子上摆放着那台神秘的笔记本电脑。 魔法师: 小鱼,你已经学会了如何安装魔法解释器和代码编辑器。是时候开始编写你的第一个Python魔法程序了! 小鱼:(兴奋地两眼放光)我准备好了! 魔法师: 不用担心,…

Lesson6---案例:人脸案例

学习目标 了解opencv进行人脸检测的流程了解Haar特征分类器的内容 1 基础 我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特…

解决Debian系统通过cifs挂载smb后,中文目录乱码问题

解决Debian系统通过cifs挂载smb后,中文目录乱码问题 //$smb_server/share /mnt/nas_share cifs credentials/root/.smbcredentials,iocharsetutf8 0 0默认通过以上命令挂载smb,但是在查看文件目录时,中文乱码 解决问题方式: de…

BLDC无感方波控制

BLDC无感控制 反电动势过零检测反电动势检测方法比较器模式采样过零信号闭环的建立 BLDC 方波启动技术转子预定位电机的外同步加速电机运行状态的转换 程序部分 反电动势过零检测 它的主要核心就是通过检测定子绕组的反电动势过零点来判断转子当前的位置。 三相六状态 120通电…

JavaScript -【第二周】

文章来源于网上收集和自己原创,若侵害到您的权利,请您及时联系并删除~~~ 理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力 运算符语句综合案例 1. 运算符 算术运算符赋值运…