22.Lambda 表达式

Lambda 表达式

    • 1. 概况
    • 2. 函数式接口
    • 3. 格式
      • 3.1 完整格式
      • 3.2 省略格式
    • 4. 代码示例
    • 5. 输出结果
    • 6. 注意事项

学习Lambda表达式之前最好先学会 匿名内部类

具体信息请查看 API 帮助文档

1. 概况

Lambda 表达式是一种在编程中用来表示匿名函数的简洁语法。它是基于函数式编程风格的一种特性,最初在Java 8中引入。Lambda 表达式允许开发者将函数作为方法参数传递或者以内联的方式定义,并且可以使用函数式接口进行类型推断。

Lambda 表达式的语法可以分为三个部分:

  1. 形参列表:指定函数的输入参数,可以有零个或多个参数。
  2. 箭头符号(->):分隔参数列表和Lambda表达式的主体。
  3. Lambda表达式主体:定义了函数的逻辑。

Lambda 表达式与匿名内部类类似,但它更加简洁、灵活,并且可读性更强。使用Lambda表达式可以更加方便地编写函数式接口的实现,减少代码量,并提高代码的可读性。

2. 函数式接口

函数式接口是指仅包含一个抽象方法的接口。函数式接口在函数式编程中以被Lambda表达式所使用。Java 8及以上版本引入了对函数式接口的支持。

函数式接口的特点:

  • 只包含一个抽象方法

    函数式接口只有一个未实现的方法,该方法即为函数式接口的抽象方法。其余的方法可以是默认方法或静态方法,不影响函数式接口的特性。

  • 能够使用Lambda表达式

    由于函数式接口只有一个抽象方法,所以可以使用Lambda表达式来实现该方法。

  • 可以使用注解 @FunctionalInterface 显式标记

    使用该注解可以确保接口是一个函数式接口,如果接口不符合函数式接口的定义(包含多个抽象方法),编译器会报错。

函数式接口可以用于各种场景,包括但不限于:

  • 函数作为参数:函数式接口可以作为方法参数,通过Lambda表达式传递函数的逻辑。

  • Lambda表达式和方法引用:函数式接口可以通过Lambda表达式或者方法引用进行实例化。

  • 并发编程:函数式接口常用于并发编程中的函数式接口API(如java.util.function包),以提供便捷的线程操作。

Java 8提供了一些常用的函数式接口,例如FunctionPredicateConsumerSupplier等,它们可以通过java.util.function包进行使用。

3. 格式

3.1 完整格式

  • 完整格式
	Lambda表达式:
	    格式:
	        () -> {
	        方法体 ;
	        }
  • ()  :对应着方法的形参
    
  • ->  :固定格式
    
  • {}  :对应着方法的方法体
    

例如:

		// Lambda表达式完整形式按照字符串的长度升序排序
        Arrays.sort(arr, (String o1, String o2) -> {
                    return o1.length() - o2.length();
                }
        );

3.2 省略格式

  • Lambda的省略规则:

    • 1.参数类型可以省略不写

    • 2.如果只有一个参数,参数类型可以省略,同时()可以省略

    • 3.如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略

例如:

 		//Lambda表达式省略形式按照字符串的长度升序排序
        Arrays.sort(arr, (o1, o2) -> o1.length() - o2.length());

4. 代码示例

需求:利用Lambda表达式对下列数据进行排序,数据如下 {3, 8, 5, 9, 4, 10, 3, 3, 5, 6};

例如:

package text.text02;

import java.util.Arrays;
import java.util.Comparator;

/*
Lambda表达式:
    格式:
        () -> {
        方法体 ;
        }
():对应着方法的形参
->:固定格式
{}:对应着方法的方法体

注意点:
    Lambda表达式可以用来简化匿名内部类的代码
    Lambda表达式只能简化函数式接口的匿名内部类的写法
    函数式接口:有且仅有一个抽象方法的接口叫做函数式接口,接口上面可以加上@FunctionalInterface注解

Lambda的省略规则:
    1.参数类型可以省略不写
    2.如果只有一个参数,参数类型可以省略,同时()可以省略
    3.如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略
 */
public class text17 {

    public static void main(String[] args) {
        Integer[] arr = {3, 8, 5, 9, 4, 10, 3, 3, 5, 6};
        //匿名内部类
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        System.out.println("升序匿名内部类:" + Arrays.toString(arr));  //升序匿名内部类:[3, 3, 3, 4, 5, 5, 6, 8, 9, 10]

        //Lambda表达式完整写法
        Arrays.sort(arr,
                (Integer o1, Integer o2) -> {
                    return o2 - o1;
                }
        );
        System.out.println("降序Lambda表达式完整写法:" + Arrays.toString(arr));  //降序Lambda表达式完整写法:[10, 9, 8, 6, 5, 5, 4, 3, 3, 3]
        // Lambda表达式省略写法
        Arrays.sort(arr, (o1, o2) -> o2 - o1);
        System.out.println("降序Lambda表达式省略写法:" + Arrays.toString(arr));  //降序Lambda表达式省略写法:[10, 9, 8, 6, 5, 5, 4, 3, 3, 3]
    }
}


5. 输出结果

在这里插入图片描述

6. 注意事项

在使用Lambda表达式时的注意事项:

  1. 函数式接口匹配:Lambda表达式通常用于函数式接口的实现。确保Lambda表达式的参数列表和返回类型与函数式接口的抽象方法匹配。

  2. 变量捕获:Lambda表达式可以捕获外部的局部变量,但需要注意这些变量必须是最终(final)或实际上是最终(effectively final)的。这是因为Lambda表达式创建的闭包会持有对这些变量的引用。

  3. 方法引用:Lambda表达式可以通过方法引用来简化代码。方法引用是对已有方法的引用,可以通过ClassName::methodName的方式来表示。

  4. 括号的使用:当Lambda表达式的主体只有一条语句时,可以省略大括号。但是,如果这条语句是一个代码块,需要使用大括号将代码块括起来。

  5. 异常处理:Lambda表达式中的异常需要显示地处理或声明。可以使用try-catch语句处理异常,也可以在函数式接口的方法声明中使用throws子句声明异常。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024.1.27每日一题

LeetCode 最大合金数 2861. 最大合金数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 假设你是一家合金制造公司的老板&#xff0c;你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用&#xff0c;并且你可以使用 k 台机器来制造合金。每台机器都需…

SpringBoot之JWT登录

JWT JSON Web Token&#xff08;JSON Web令牌&#xff09; 是一个开放标准(rfc7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任&#xff0c;因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…

嵌入式学习第十三天

9.指针: &#xff08;1&#xff09;const指针 const 关键字 常量(只读) 1.const int *p; 2.int const *p; 1和2是等价的 const修饰 *p,指针变量p的值可以改变,但不能利用指针修改指向空间中的值 3.int *const p; const修饰 p,指针变量p的值不能改变…

【教程】极简Docker搭建“帕鲁幻兽PalWorld”服务器, 附资源

注意&#xff1a; 如果搭建在个人服务器或者内网中&#xff0c;需要做内网穿透&#xff0c;可以看这篇博客&#xff1a; 【教程】超详细安装和使用免费内网穿透软件Zerotier-One-CSDN博客文章浏览阅读523次&#xff0c;点赞8次&#xff0c;收藏8次。真的很详细https://blog.csd…

[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

Mysql查询数据

1 基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是&#xff1a; 2 单表查询 2.1 查询所有字段 SELECT * FROM 表名; 2.2 在SELECT语句中指定所有字段 SELECT f_id, s_id ,f_name, f_price FROM fruits; 2.3 查询单个字段 SELECT 列名FR…

Ajax入门与使用

目录 ◆ AJAX 概念和 axios 使用 什么是 AJAX&#xff1f; 怎么发送 AJAX 请求&#xff1f; 如何使用axios axios 函数的基本结构 axios 函数的使用场景 1 没有参数的情况 2 使用params参数传参的情况 3 使用data参数来处理请求体的数据 4 上传图片等二进制的情况…

C数据类型

目录 1. 数据类型分类 2. 整数类型 3. 浮点类型 4. void 类型 5. 类型转换 1. 数据类型分类 在 C 语言中&#xff0c;数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 C 中…

格外空间以设计带动凯迪仕品牌价值增长 | 揽获6项国际设计大奖

Kaadas凯迪仕专注于智能锁领域&#xff0c;作为一家集产品研发、制造、品牌、全球销售、安装、售后于一体的全产业链公司&#xff0c;致力于服务全球每一个家庭&#xff0c;以更优质的产品&#xff0c;为全球众多家庭带去高品质生活体验。基于新消费时代背景&#xff0c;传统空…

联想懂的通信×实在智能:共同探索智连融合AI创新发展路径

近日&#xff0c;联想集团副总裁/联想懂的通信CEO王帅、CFO周利军、COO&CPO邢海洋、CGO赵晨、CTO边毅等领导一行莅临杭州实在智能科技有限公司开展研讨座谈。 实在智能创始人&CEO孙林君、联合创始人&COO高扬、联合创始人&CMO张俊九、销售VP&运营商事业线负…

成都直播产业园核心优势全面解读,入驻天府锋巢直播产业基地都有哪些好处?

一文讲清&#xff01;成都直播产业园核心优势全面解读 企业入驻天府锋巢直播产业基地能获得哪些好处&#xff1f; 锋巢资讯&#xff5e;又来了&#xff5e;&#xff5e;&#xff5e; 今天&#xff0c;将为您全面解读成都产业园重点特色产业服务&#xff08;上&#xff09; 什…

vit细粒度图像分类(五)TransFC学习笔记

1.摘要 细粒度图像具有不同子类间差异小、相同子类内差异大的特点。现有网络模型在处理过程中存在特征提取能力不足、特征表示冗余和归纳偏置能力弱等问题&#xff0c;因此提出一种改进的 Transformer图像分类模型。 首先&#xff0c;利用外部注意力取代原 Transformer模型中的…

Java之Idea中创建Web项目

一、新建动态web项目 1、新建项目 2、选择创建动态web项目 3、项目命名 4、编辑index.jsp 二、配置Tomcat 1、新增tomcat服务器配置 2、选择服务器类型 3、配置服务器参数 4、部署项目 5、完成配置 6、启动运行 7、访问web项目 在浏览器地址栏输入&#xff1a; http://local…

RSTP的P/A机制

如图所示根桥S1和S2之间新添加了一条链路,在当前状态下S2的另外几个端口p2是Alternate端口,p3是指定端口且处于Forwarding状态,p4是边缘端口。新链路连接成功后,P/A机制协商过程如下。 1.P0和P1两个端口马上都先成为指定端口发送RS TBPDU。 2.S2的P1口收到更优的RST BPD…

动手学深度学习(一)深度学习介绍2

目录 二、起源 三、深度学习的成功案例&#xff1a; 四、特点&#xff1a; 五、小结&#xff1a; 二、起源 为了解决各种各样的机器学习问题&#xff0c;深度学习提供了强大的工具。 虽然许多深度学习方法都是最近才有重大突破&#xff0c;但使用数据和神经网络编程的核心思…

幻兽帕鲁服务器出租,腾讯云PK阿里云怎么收费?

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云换手帕服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G3…

Life is Strange 奇异人生汉化指南

奇异人生汉化指南 引言&#xff1a;在搜索引擎上看了许多的攻略&#xff0c;都无法得到指向性明确的安装步骤&#xff0c;其中最令人不解的分别为汉化包与汉化包的安装地址&#xff0c;以下会以汉化包获取与汉化包安装地址两个维度来确保汉化的正确&#xff0c;以及在最终附上…

第十八讲_HarmonyOS应用开发实战(实现电商首页)

HarmonyOS应用开发实战&#xff08;实现电商首页&#xff09; 1. 项目涉及知识点罗列2. 项目目录结构介绍3. 最终的效果图4. 部分源码展示 1. 项目涉及知识点罗列 掌握HUAWEI DevEco Studio开发工具掌握创建HarmonyOS应用工程掌握ArkUI自定义组件掌握Entry、Component、Builde…

排序【数据结构】

文章目录 一、 稳定性二、排序1. 插入排序(1) 直接插入排序(2) 希尔排序 2. 选择排序(1) 直接选择排序(2) 堆排序 3. 交换排序(1) 冒泡排序(2) 快速排序① 普通版快排② 关于优化快排③ 快速排序的非递归方式 4. 归并排序5. 计数排序 三、 总结 一、 稳定性 在计算机科学中&am…

给刚上小学的侄女准备新年礼物,有什么让小朋友喜欢的玩具推荐?

给刚上小学的侄女准备新年礼物&#xff0c;我觉得也是有很多选择的。因为现在的市场上款式太多了&#xff0c;选择自己心意的适合小侄女的都是可以的。但是如果非要选益智的或是智能高科技的&#xff0c;对孩子来说既能玩耍又能在玩的同时学习到知识&#xff0c;能够开拓孩子眼…