【Java SE】Lambda表达式

news2025/1/23 6:15:58

目录

♫什么是Lambda表达式

♫Lambda表达式的语法

♫函数式接口

 ♫Lambda表达式的使用

 ♫变量捕获

♫ Lambda表达式在集合中的使用

♪Collection的foreach():

♪List的sort():

♪Map的foreach()


♫什么是Lambda表达式

Lambda 表达式是 Java SE 8中一个重要的新特性,它是一种匿名函数,常作为函数式编程的一部分,用于向函数传递行为作为参数,或者用于将行为作为返回值返回。 Lambda表达式提供了一个正常的参数列表和一个使用这些参数的主体(body, 可以是一个表达式或一个代码块)。

♫Lambda表达式的语法

基本语法 : (parameters) ->{ 方法体 }
①. paramaters :类似方法中的形参列表,这里的参数是函数式接口里的参数。(参数类型可以明确的声明 ,也可不声明而由 JVM 隐含的推断;当只有一个推断类型时可以省略掉圆括号)
②. -> :可理解为 被用于 的意思
③. 方法体 :可以是表达式也可以代码块,是函数式接口里方法的实现。(代码块可返回一个值或者什么都不返回,这里的代码块块等同于方法的方法体;如果是表达式,也可以返回一个值或者什么都不反回)
//1. 不需要参数,返回值为2
()->2;
//2. 接收一个参数(数字类型),返回其2倍的值
x->2*x;
//3. 接受2个参数(数字),并返回他们的和
(x,y)->x+y;
//4. 接收2个int型整数,返回他们的乘积
(int x,int y)->x*y;
//5. 接受一个string对象,并在控制台打印,不返回任何值
(String s)->System.out.print(s);

注:
①.->前只有一个参数,()可以省略;
②.->后只有一条语句,{}可以省略;
③.->后只有return语句,return可以去掉;
④.()里 的参数类型可以省略,如果要省略,每个参数的类型都要省略。

♫函数式接口

要了解 Lambda 表达式 , 还需要先了解什么是函数式接口。函数式接口是一种特殊的接口,它的接口里有且只有一个抽象方法
@FunctionalInterface
interface A {
    //抽象方法有且只有一个
    public void fun();
    //可以有被default修饰的具体方法
    default void fun2() {
        System.out.println("JDK1.8新特性,default默认方法可以有具体的实现");
    }
}

注:

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

②.可以在接口上方加上@FunctionalInterface注释,让编译器帮助我们检查该接口是不是一个函数式接口。

③.JDK1.8之后,函数式接口里允许存在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);
}

下面我们通过Lambda表达式对上面几个函数式接口进行实例化操作:

public class Test {
    public static void main(String[]args) {
        //无参数无返回值
        NoParameterNoReturn noParameterNoReturn = () -> {
            System.out.println("无参数无返回值");
        };
        noParameterNoReturn.test();

        //一个参数无返回值
        OneParameterNoReturn oneParameterNoReturn = (int a) -> {
            System.out.println("一个参数无返回值:" + a);
        };
        oneParameterNoReturn.test(10);

        //多个参数无返回值
        MoreParameterNoReturn moreParameterNoReturn = (int a, int b) -> {
            System.out.println("多个参数无返回值:" + a + "" + b);
        };
        moreParameterNoReturn.test(20, 30);

        //有返回值无参数
        NoParameterReturn noParameterReturn = () -> {
            System.out.println("有返回值无参数");
            return 40;
        };
        int ret = noParameterReturn.test();
        System.out.println(ret);

        //有返回值有一个参数
        OneParameterReturn oneParameterReturn = (int a) -> {
            System.out.println("有返回值有一个参数");
            return a;
        };
        ret = oneParameterReturn.test(50);
        System.out.println(ret);
        
        //有返回值多个参数
        MoreParameterReturn moreParameterReturn = (int a, int b) -> {
            System.out.println("有返回值多个参数");
            return a + b;
        };
        ret = moreParameterReturn.test(60, 70);
        System.out.println(ret);
    }
}

注:Lambda表达式只能应用于函数式接口。

 ♫变量捕获

变量捕获是指将外部类中的变量复制到内部类中,这样内部类就可以在外部类的作用域之外访问这些变量。

匿名内部类和lambda表达式都存在变量捕获:

@FunctionalInterface
interface B {
    void fun();
}
public class Test {
    public static void main(String[] args) {
        int a = 10;
        //匿名内部类:
        B b1 = new B() {
            @Override
            public void fun() {
                System.out.println("匿名内部类a=" + a);
            }
        };
        b1.fun();
        //Lambda表达式:
        B b2 = () -> {
            System.out.println("Lambda表达式a=" + a);
        };
        b2.fun();
    }
}

运行结果如下:

需要注意的是:被捕获的变量要么是被final修饰,要么是隐式 final 的(在使用之前没有被修改):

@FunctionalInterface
interface B {
    void fun();
}
public class Test {
    public static void main(String[] args) {
        int a = 10;
        //a = 11;//①
        //匿名内部类:
        B b1 = new B() {
            @Override
            public void fun() {
                //a = 11;//②
                System.out.println("匿名内部类a=" + a);
            }
        };
        b1.fun();
        //a = 11;//③
    }
}
在①、②、③任意一处去掉注释都会报错:

♫ Lambda表达式在集合中的使用

为了能够让 Lambda Java 的集合类集更好的一起使用,Java集合中新增了部分接口,以便与 Lambda 表达式对接:
接口新增方法
Collection
removeIf()、spliterator()、stream()、parallelStream()、forEach()
List
replaceAll()、sort()
Map
getOrDefault()、forEach()、replaceAll()、putIfAbsent()、remove()、replace()、computeIfAbsent()、computeIfPresent()、compute()、merge()

♪Collection的foreach():

foreach()的部分源码:

foreach()的应用:

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(2);
        list.forEach(s-> System.out.print(s+" "));
    }
}

运行结果:

♪List的sort():

sort()的部分源码:

sort()的应用:

class Test2 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(2);
        list.sort((str1,str2)->str1-str2);
        System.out.println(list);
    }

}

运行结果:

♪Map的foreach()

foreach()的部分源码:

foreach()的应用:

class Test3 {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c",3);
        map.forEach((k,v)->System.out.println(k+"="+v));
    }
}

运行结果:

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

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

相关文章

Socks5代理IP是什么?有什么优点及如何使用?

随着网络威胁和数据泄露的数量不断增加&#xff0c;在浏览互联网时保护个人信息并保持匿名变得至关重要。实现此目的的一种有效方法是使用Socks5代理IP。如今Socks5代理被广泛应用于跨境电商/社媒平台、SEO业务、网络抓取等领域&#xff0c;在这篇文章中&#xff0c;我们将讨论…

服务好的CMDB运维管理平台的服务优势

随着公司信息化程度的不断提高&#xff0c;IT基础设施也越来越复杂。为了方便这些基础设施的管理和维护&#xff0c;CMDB&#xff08;配置管理数据库&#xff09;运维管理平台应运而生。本文将介绍一个服务好、价格实惠的CMDB运维管理平台&#xff0c;帮助读者更好地了解和使用…

扫地机器人经营商城小程序的作用是什么

扫地机器人对人们生活大有帮助&#xff0c;近些年也有不少企业开创品牌&#xff0c;在电商平台每年销量也非常高&#xff0c;同行竞争激烈及私域化程度加深情况下&#xff0c;虽然第三方平台或线下方式也有生意&#xff0c;但互联网电商发展也为商家们带来了诸多痛点。 那么通…

CRM软件系统如何选择部署方式

CRM的部署方式是选型的主要衡量标准&#xff0c;云部署CRM系统指应用程序在技术商的公有云上&#xff0c;本地化部署将应用程序架设在本地基础设施上&#xff0c;享有应用的所有权。那么CRM系统选择云部署还是本地化部署&#xff1f; 1.云部署CRM系统性价比更高 我们知道本地…

HTTP 跨域名请求(CORS)

同源策略 出于安全考虑&#xff0c;浏览器会限制脚本中发起的跨域请求。比如&#xff0c;使用 XMLHttpRequest 对象和Fetch发起 HTTP 请求就必须遵守同源策略。 具体而言&#xff0c;Web 应用程序通过 XMLHttpRequest 对象或Fetch能且只能向同域名的资源发起 HTTP 请求&#x…

python通过csv库处理CSV文件

CSV库还有其他处理CSV的方法&#xff0c;这里只是介绍几个常用的&#xff0c;后面如果用到别的会进行更新 目录 1 生成一个新的csv文件&#xff0c;并向其中写一点东西 2 单纯往里面写几行 3 读取csv文件 1 生成一个新的csv文件&#xff0c;并向其中写一点东西 import…

工作中Git管理项目和常见问题处理

工作中Git管理项目和常见问题处理 Git仓库的管理方式为什么会出现无法push到线上处理方法 Git仓库的管理方式 共用统一仓库,不同开发人员使用不同分支 步骤 下载代码 git clone <url>查看分支 git branch创建并切换分支 git checkout -b dev分支名称保持和远程分支一…

crypto:Rabbit

题目 根据题目下载压缩包后解压&#xff0c;可得到文本提示 知识盲区&#xff0c;去了解一下Rabbit加密的密文特征 AES、DES、RC4、Rabbit、Triple DES&#xff08;3DES&#xff09; 这些算法都可以引入密钥&#xff0c;密文特征与Base64类似&#xff0c;明显区别是秘文里​​…

使用U3D、pico开发VR(一)——将unity的场景在设备中呈现

最近srtp项目在赶进度&#xff0c;自己之前是在电脑端进行的开发。但是项目是VR端&#xff0c;因此需要重新学习&#xff0c;在此记录一下自己的学习经历。 首先&#xff0c;如何将unity的场景在自己的眼镜中进行呈现呢&#xff1f; 对此&#xff0c;我也找了很多教程&#xff…

关于redis的一主三从三哨兵的实现

关于redis的一主三从三哨兵的实现 前言docker相关的docker-compose.ymlsentinel.conf重点解释一下上面的语句 前言 当谈到数据库管理系统时&#xff0c;Redis就像是那个充满魔法的巫师&#xff0c;能够让你的应用程序变得更快、更可靠&#xff0c;就像是施了魔法一样。而今天&…

HONEYWELL 05704-A-0145

HONEYWELL 05704-A-0145电源模块通常用于为其他设备或系统提供电力供应&#xff0c;以确保它们正常运行。HONEYWELL 05704-A-0145电源模块的应用领域可以非常广泛&#xff0c;包括但不限于以下几个领域&#xff1a; 工业自动化&#xff1a;HONEYWELL 05704-A-0145电源模块用于工…

NEON优化:性能优化经验总结

NEON优化&#xff1a;性能优化经验总结 1. 什么是 NEONArm Adv SIMD 历史 2. 寄存器3. NEON 命名方式4. 优化技巧 Reference: NEON优化&#xff1a;性能优化经验总结NEON官方内联函数Arm NEON programming quick referenceLearn the architecture - Neon programmers’ guide …

Windows server 2022(2023年9月 映像更新 - 20348.1970)安装测试

本文记录了Windows server 2022(2023年9月 映像更新 - 20348.1970)的安装测试过程。 一、检查ISO 简体中文 - Windows Server 2022&#xff08;2023年9月更新 - 20348.1970&#xff09; 内含版本&#xff08;Windows Server 2022 Standard、Windows Server 2022 Standard (D…

期权定价模型系列【6】:欧式期权、百慕大期权、美式期权的定价模型与对比【蒙特卡洛模拟、二叉树模型】

期权定价模型系列第6篇文章 1. 前言 对于欧式期权&#xff0c;最常用的是BS模型&#xff0c;此外&#xff0c;也可也用蒙特卡洛模拟方法求解欧式期权的价格。当然&#xff0c;对于美式期权&#xff0c;也同样可以用蒙特卡洛模拟方法来求解&#xff0c;一般对美式更多用的是二叉…

Kubernetes(K8s):未来云原生应用的引擎

文章目录 Kubernetes的核心概念和架构为什么K8s是构建云原生应用的首选工具&#xff1f;云原生应用的好处和挑战容器编排的重要性&#xff1a;Docker和KubernetesKubernetes生态系统&#xff1a;核心组件和附加工具实际应用&#xff1a;企业如何在生产环境中使用K8s未来展望&am…

基于大语言模型扬长避短架构服务

秘诀&#xff1a; 扬泛化之长&#xff0c; 避时延之短

Linux socket 字节序

socket介绍 字节序 验证什么字节序 #include<stdio.h> int main() {union {short value;char btypes[sizeof(short)];} test;test.value 0x0102;if(test.btypes[0] 1 && test.btypes[1] 2) {printf("大端字节序\n");}else{printf("小端字节序…

postman的使用

感觉自己对于postman 的使用其实还是入门级别的 因为新公司的都是微服务调用所以需要使用本地postman进行调用。 接口大概是这个样子&#xff0c;截图的最下面就是接口的具体情况了 首先看PostMapping判断是否是get或者post 然后RequestHeader参数就是为了在postman中添加head…

安卓玩机-----教你修改微信的启动图 让心中的“她“成为微信沟通的第一屏【仅供参考】

微信已经成为我们生活中必不可少的安装必装软件之一。但单调的启动第一屏让人感到乏味。那么今天只给大家做个教程演示是怎么修改这个启动第一屏、其实任何的app都可以进行修改图标 启动界面等等的操作。需要替换的图片可以任意选择&#xff0c;我前面很多博文介绍过apk的反编译…

Mac 电脑查看本地maven,及私有仓库的搭建与使用【nexus的配置与使用】

查看本地maven 查看状态如果要查看本地maven&#xff0c;使用命令行&#xff1a; mvn help:effective-settings 如下如localRepository标签 nexus下载 官网地址 解压后如下图 启动服务器/停止服务器 bin 目录下 执行命令&#xff1a; ./nexus start 如下图表面启动成功…