Java-数据结构-Lambda表达式 (✪ω✪)

news2024/11/23 21:12:04

文本目录:

❄️一、背景:

           ➷ 1、Lambda表达式的语法:

           ➷ 2、函数式接口:

❄️二、Lambda表达式的基本使用:

           ➷ 1、语法精简:

❄️三、变量捕获:

❄️四、Lambda在集合中的使用:

           ☑ 1、Collection接口:

           ☑ 2、List接口:

           ☑ 3、Map接口:

❄️五、Lambda的优缺点:

           ☑ 1、优点:

            ☑ 2、缺点:

❄️总结:


❄️一、背景:

     Lambda 表达式是Java SE 8中一个重要的新特性。lambda表达式允许通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体 。Lambda 表达式,基于数学中的 λ 演算得名,也可称为闭包。


           ➷ 1、Lambda表达式的语法:

基本语法:

(parameters) -> 方法体 

其中:

parameters:类似方法中的形参列表,这里的参数是 函数式接口 里的参数。

                       这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。

                       另外当只有一个推断类型时可以省略掉圆括号。

-> :可以理解为 “被用于” 的意思。

方法体可以是表达式也可以代码块,是函数式接口里方法的实现。

              代码块可返回一个值或者什么都不反回,这里的代码块等同于方法的方法体。

              如果是表达式,也可以返回一个值或者什么都不返回。


示例:

//1、不需要参数,返回值为10
() -> 10;

//2、接收一个参数(数字),返回其 3 倍的值
x -> 3 * x;

//3、接收两个参数,返回它们的和
(x,y) -> x + y;

//4、接收两个(int)类型的参数,返回它们的乘积
(int x,int y) -> x * y;

//5、接收一个 String,并在控制台打印,不返回任何值
(String s) -> System.out.println(s);


           ➷ 2、函数式接口:

函数式接口定义:一个接口有且只有一个抽象方法。

注意:

1、如果一个接口只有一个抽象方法,那么该接口就是 函数式接口

2、如果我们在某个接口上声明了  @FunctionalInterface 注解的话,那么编译器就会按照 函数式接口 的定义来要求该接口,这样当你放入两个抽象方法的时候就会报错。

函数式接口的定义方式:

@FunctionalInterface
interface IA {
    void teat();
}

同样可以这样编写:

@FunctionalInterface
interface IA {
    void teat();
    default void teat2() {
        System.out.println("default方法");
    }
} 

❄️二、Lambda表达式的基本使用:

我们来一个一个来看看如何使用的,我们先来看看一些接口:

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {
    void test();
}

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}

//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}

//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}

无返回值无参数:

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {
    void test();
}
public class Test {
    public static void main(String[] args) {

        NoParameterNoReturn noParameterNoReturn = () -> {System.out.println("test的重写方法");};
        noParameterNoReturn.test();
    }
}

无返回值有一个参数:

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}
public class Test {
    public static void main(String[] args) {
        
        OneParameterNoReturn oneParameterNoReturn = (int a) -> {System.out.println(a);};
        oneParameterNoReturn.test(20);
    }
}

这个呢是可以 进行简化的,我们来看看简化后的:

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}
public class Test {
    public static void main(String[] args) {
        
        //OneParameterNoReturn oneParameterNoReturn = (int a) -> {System.out.println(a);};
        OneParameterNoReturn oneParameterNoReturn = a -> System.out.println(a);
        oneParameterNoReturn.test(20);
    }
}

无返回值多个参数:

//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}
public class Test {
    public static void main(String[] args) {
        
        //MoreParameterNoReturn moreParameterNoReturn = (int a,int b) -> {System.out.println(a+b);};
        //简化后:
        MoreParameterNoReturn moreParameterNoReturn = (a,b) -> System.out.println(a+b);
        moreParameterNoReturn.test(10,20);
    }
}

有返回值无参数:

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}
public class Test {
    public static void main(String[] args) {

        //NoParameterReturn noParameterReturn = () -> {return 20;};
        //简化后:
        NoParameterReturn noParameterReturn = () -> 20;
        System.out.println(noParameterReturn.test());
    }
}

有返回值有一个参数:

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}
public class Test {
    public static void main(String[] args) {

        //OneParameterReturn oneParameterReturn = (int a) -> {return a + 10;};
        //简化后:
        OneParameterReturn oneParameterReturn = (a) -> a + 10;
        System.out.println(oneParameterReturn.test(20));
    }
}

有返回值有多个参数:

//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}
public class Test {
    public static void main(String[] args) {
        //MoreParameterReturn moreParameterReturn = (int a,int b) -> {return a * b;};
        //简化后:
        MoreParameterReturn moreParameterReturn = (a,b) ->  a * b;
        System.out.println(moreParameterReturn.test(30, 2));
    }
}

到这就简单的使用结束了,我们往后看:


           ➷ 1、语法精简:

1. 参数类型可以省略,如果需要省略,每个参数的类型都要省略。
2. 参数的小括号里面只有一个参数,那么小括号可以省略。
3. 如果方法体当中只有一句代码,那么大括号可以省略。
4. 如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字。


❄️三、变量捕获:

       那么什么是 变量捕获 呢?我们在介绍 匿名内部类的时候呢,我们就有过 变量捕获 的这个情况,我们再重新来看一看:

     这个 new 的 T 这个就是一个 匿名内部类,当我们定义一个变量 a 之后,如果改变的话,并且在 匿名内部类 中使用的话,那么就会报错,这个就是捕获变量。在其内部更改变量的值的话,同样会报错。这就是——变量捕获


我们来看看 Lambda表达式 的变量捕获:

这就是 Lambda表达式 的变量捕获。


❄️四、Lambda在集合中的使用:

     为了能让 Lambda 在Java的集合类中能更好的使用呢,在集合中呢,也添加了一些接口,以便于和 Lambda 使用。

对应的接口新增的方法
Collection

removeIf()、stream()、spliterator()、parallelStream()、forEach()

List

replaceAll()、sort()

Map

getOrDefault()、forEach()、replaceAll()、remove()、replace()、putIfAbsent()、

computeIfAbsent()、computeIfPresent()、compute()、merge()

可以去这里查询:

         Java官网

有很多的接口,这里呢我们就简单的介绍几个就Ok了,我们一个个来看:


           ☑ 1、Collection接口

我们这里演示一下其中的 forEach() 这个接口:

public class Test {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("abcd");
        arrayList.add("world");
        arrayList.add("hello");

        arrayList.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                //简单遍历集合中的所有元素
                System.out.println(s);
            }
        });

        System.out.println("================");
        //Lambda表达式:
        arrayList.forEach(s -> System.out.println(s));
    }
}

这个就是遍历集合中所有的元素。 


           ☑ 2、List接口

这个接口呢,我们来看看 sort() 接口:

这个是对其进行排序。

public class Test {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("abcd");
        arrayList.add("world");
        arrayList.add("hello");

        arrayList.sort((o1,o2) -> o1.compareTo(o2));

        arrayList.forEach(s -> System.out.println(s));
    }
}


           ☑ 3、Map接口

这里呢,我们介绍一下 forEach() 这个接口:

public class Test {
    public static void main(String[] args) {
        HashMap<String,Integer> map = new HashMap<>();
        map.put("abc",3);
        map.put("world",5);
        map.put("hello",4);

        map.forEach((key,val) -> System.out.println("key: " + key + " val: " + val));
    }
}


❄️五、Lambda的优缺点:

           ☑ 1、优点:

1、 代码简洁,开发迅速

2、 方便函数式编程

3、 非常容易进行并行计算

4.、Java 引入 Lambda,改善了集合操作


            ☑ 2、缺点:

1、代码可读性变差


2、在非并行计算中,很多计算未必有传统的 for 性能要高


3、不容易进行调试
 


❄️总结:

     OK,到这里呢,我们的 Lamdba表达式 呢到这里就结束了,这个呢不要感觉看起来有点难,但是呢在练习练习之后呢,这个呢就是非常简单操作了。到这里就结束了!!!拜拜~~~

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

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

相关文章

Chromium 中js navigator对象c++实现分析

一、Navigator 对象 Navigator 对象包含有关浏览器的信息。 前端测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口测试</title> </head> <body><div id"example&q…

爱心表达公式

脚本公式 local r (math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4) - 2 * math.sin(angle) 2

IOT-Tree连接西门子PLC S7 200 Smart竟然如此简单

最近一个项目需要把用户现场控制柜接入到云端&#xff0c;控制柜使用西门子PLC Smart 200 SR40型号&#xff0c;已经运行多年&#xff0c;PLC通过以太网接口对接一个触摸屏。 按照我以往的经验&#xff0c;觉得触摸屏以太网接口已经被占用&#xff0c;那么只能通过剩余的RS485…

通过一个实际的例子,介绍 Java 的自动装箱与拆箱机制

Java 中 1000 1000 返回 false&#xff0c;但 100 100 返回 true&#xff0c;这一现象背后隐藏了 Java 对于对象和基本类型的内存管理机制。为了理解这个现象&#xff0c;我们需要从 Java 的自动装箱与拆箱机制、对象引用和数值缓存策略等角度深入探讨。让我们一步一步通过 J…

电脑怎么卸载软件?学会这6个卸载软件技巧就够了(精选)

电脑怎么卸载软件&#xff1f;在日常的办公生活中&#xff0c;我们需要下载一些工具来辅助工作&#xff0c;当不需要这些工具的时候&#xff0c;我们就需要卸载这些软件了。很多小伙伴表示卸载软件卸载不干净&#xff0c;还是回残留一些文件&#xff0c;或者是卸载不了&#xf…

Verilog开源项目——百兆以太网交换机(九)表项管理模块设计

Verilog开源项目——百兆以太网交换机&#xff08;九&#xff09;表项管理模块设计 &#x1f508;声明&#xff1a;未经作者允许&#xff0c;禁止转载 &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;全新原创以太网交换机项目&#xff0c;Blog内容将聚焦整…

新型僵尸网络针对 100 个国家发起 30 万次 DDoS 攻击

近日&#xff0c;网络安全研究人员发现了一个名为 Gorilla&#xff08;又名 GorillaBot&#xff09;的新僵尸网络恶意软件家族&#xff0c;它是已泄露的 Mirai 僵尸网络源代码的变种。 网络安全公司 NSFOCUS 在上个月发现了这一活动&#xff0c;并称该僵尸网络在今年 9 月 4 日…

【Java 循环控制实例详解【While do... while】】

Java 循环控制详解【While & do… while】 在 Java 中&#xff0c;循环控制是程序设计中非常重要的部分&#xff0c;主要包括 while 循环和 do...while 循环。本文将详细介绍这两种循环的基本语法、执行流程及相关示例。 1. while 循环控制 基本语法 循环变量初始化; wh…

在uniapp中实现长按聊天对话框可以弹出对话框然后可以删除该条对话,单击可以进入该条对话框的对话页面

效果展示 效果描述 长按【大于1s】某一条对话框会弹出一个对话框&#xff0c;点击确定按钮就可以将当前对话框从列表中进行删除&#xff0c;如果点击取消则不做额外操作。 如果只是点击了一下&#xff0c;时间【小于1s】的情况下会直接引入到与该用户的对话框详情页面。 代码…

ai绘画变现方式全解析,教你如何通过AI绘画赚钱

*AI绘画变现方式全解析&#xff0c;教你如何通过AI绘画赚钱* *为什么选择AI绘画&#xff1f;* 你是否曾经梦想过成为一名画家&#xff0c;但现实却让你无从下手? 或者你已经是一位艺术家&#xff0c;但苦于作品没能带来足够的收入&#xff1f;随着AI技术的飞速发展&#xff…

IDEA没有代码自动提示问题的解决

一、问题描述 如图&#xff0c;博主输入new Hash 没有提示出HashMap之类的api 原因在于&#xff1a;不小心打开了idea的省电模式&#xff0c;在这个模式下&#xff0c;idea是不会为我们提供自动提示的 二、问题解决 在File中找到 Power Save Mode选项&#xff0c;将它关闭即…

【西电电路实验】1. 仪器的使用(电子线路 III 电院)

文章目录 前言一、实验原理二、实验过程1. [高频信号源DSG3030 数据手册](https://www.rigol.com/Images/DSG3000_DataSheet_CN_tcm4-3558.pdf)2. [信号源 SDS 2320X 数据手册](https://www.siglent.com/u_file/download/24_05_29/SDS2000X%20HD_Datasheet_CN02A.pdf#:~:textSD…

MySQL多表查询:标量子查询

先看我的emp表结构 emp表 子查询基本语法 select * from t1 where column1 (select column1 from t2);例子1&#xff1a;查询"销售部" 的所有员工信息 这个可以先拆解为两个 a.查询"销售部"的部门ID select id from dept where name 销售部; b. 根…

2024重生之回溯数据结构与算法系列学习(11)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️ MYSQL REDIS Advance operation 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️HCIP&#xff1b;H3C-SE;CCIP——…

算法:724.寻找数组的中心下标

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;前缀和&#xff09; 根据题意&#xff0c;我们可以将数组看成三个部分 [left] [mid] [right] 我们只需要[left]区间内的元素和等于[right]区间的元素和即可&#xff0c;此时mid就是中心下标 那么我们可以借助前缀和思…

怎么把录音转换成文字?七大不收费的录音转文字软件推荐,亲测好用!

怎么把录音转换成文字&#xff1f;录音转文字软件是一种可以将音频文件转换成文本的工具&#xff0c;甚至可以在录制音频的同时实时生成文本。音频文件是存储信息的常用方式之一&#xff0c;广泛应用于在线课程、长时间的讲座、商务会议以及产品介绍等场合&#xff0c;音频内容…

ThreadPoolExecutor的源码解析

ThreadPoolExecutor的源码解析 线程池的核心属性 ctl:当前的ctl就是一个int类型的数值,内部是基于AtomicInteger套了一层,进行运算时,是原子性的 ctl表示的线程池的两种核心状态: 线程池的状态: ctl的高3位标识线程池的状态工作线程的状态:ctl的低29位,表示工作线程的个数 pri…

FlagVNE]——用于虚拟网络嵌入的灵活、可通用的强化学习框架

介绍 论文地址&#xff1a;https://arxiv.org/pdf/2404.12633 网络虚拟化&#xff08;NV&#xff09;是一种创新技术&#xff0c;在 5G 网络和云计算等领域日益受到关注。NV 可通过网络切片和共享基础设施在同一物理网络上部署多个用户提交的虚拟网络请求&#xff08;VNR&…

性能测试-JMeter(1)

性能测试工具 主流性能测试工具LoadrunnerJMeter JMeter环境安装JMeter功能概要JDK常用文件目录介绍JMeter元件和组件介绍元件的基本介绍组件的基本介绍 JMeter元件作用域和执行顺序JMeter第一个案例线程组HTTP请求查看结果树 JMeter参数化&#xff08;重点&#xff09;用户定义…

02_InFluxDb

InFluxDb 初始化初始化流程 交互InFluxDbWebUI交互 数据模型行协议添加标签数据格式 数据类型空格索引 初始化 初始化流程 用户 密码 组织名称 Bucket—mysql里面的数据库概念 交互InFluxDb 暂用了8086端口.提供了 http api WebUI交互 略... 数据模型 这是mysql里面的表…