22.Lambda 表达式

news2024/10/2 16:29:10

Lambda 表达式

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

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

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子句声明异常。

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

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

相关文章

2024.1.26每日一题

LeetCode 边权重均等查询 2846. 边权重均等查询 - 力扣&#xff08;LeetCode&#xff09; 题目描述 现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi,…

微信小程序(十六)slot插槽

注释很详细&#xff0c;直接上代码 上一篇 温馨提醒&#xff1a;此篇需要自定义组件的基础&#xff0c;如果不清楚请先看上一篇 新增内容&#xff1a; 1.单个插槽 2.多个插槽 单个插糟 源码&#xff1a; myNav.wxml <view class"navigationBar custom-class">…

【C++】C++入门基础讲解(一)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读 经过一段时间的C语言学习&#xff0c;我们以及基本掌握了C语言的知识&#xff0c;今天&#xff0c;我们就开始学习C&#xff0c;…

网络安全相关知识点总结

网络安全背景 网络空间安全 --- Cyberspace 2003年美国提出网络空间的概念 --- 一个由信息基础设施组成的互相依赖的网络。 我国官方文件定义&#xff1a;网络空间为继海&#xff0c;陆&#xff0c;空&#xff0c;天以外的第五大人类活动领域 阶段的变化&#xff1a; 通信保密阶…

七通道NPN 达林顿管GC2003,应用于计算机,工业和消费类产品中

GC2003 内部集成了 7 个 NPN 达林顿晶体管&#xff0c;连接的阵列&#xff0c;非常适合逻辑接口电平数字电路&#xff08;例 如 TTL&#xff0c;CMOS 或PMOS 上/NMOS&#xff09;和较高的电流/电压&#xff0c;如电灯电磁阀&#xff0c;继电器&#xff0c;打印机或其他类似的负…

Android App开发基础(1)—— App的开发特点

本文介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计是如何运作实现的&#xff0c;App的活动页面是如何创建又是如何跳转…

基于frp工具实现内网穿透,跨局域网远程SSH登录

文章目录 一.概述1.1 为什么要内网穿透&#xff1f;1.2 什么是frp&#xff1f; 二.frp安装管理流程2.1 frp下载2.2 部署2.3 通过systemd系统服务管理启动程序 三.frp配置测试&#xff08;通过SSH访问内网机器C&#xff09;3.1 服务端配置文件frps.toml修改3.2 客户端配置文件fr…

开源模型部署及使用

开源模型部署及使用 1.Langchain-Chatchat1.环境2.运行3.效果 2.facefusion1.环境2.运行3.效果 3.Aquila1.环境2.运行 1.Langchain-Chatchat Langchain-Chatchat这里面可以调用许多模型&#xff0c;我本地下载了chatglm3模型文件&#xff0c;所以就用这个模型。 1.环境 根据…

Python如何实现队列的同步实现

队列 q Queue.Queue(maxsize 10) 创建一个“队列”对象。Queue.Queue类即是一个队列的同步实现。队列长度可为或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度。 q.put()方法在队尾插入一个项目。put()有两个参数&#x…

解决Windows系统本地端口被占用

目录 一、被程序占用端口 1.通过终端杀掉占用端口的进程 2.任务管理器 二、被系统列为保留端口 前言&#xff1a; 首先了解为什么会出现端口被占用的情况 端口被占用的情况可能出现的原因有很多&#xff0c;主要有以下几点&#xff1a; 1.多个应用程序同时启动&…

如何对图片进行引用。

问题描述&#xff1a;如何对图片进行引用。 问题解答&#xff1a; 在图片描述处和图片标题处引用即可。

【C++11并发】mutex 笔记

简介 在多线程中往往需要访问临界资源&#xff0c;C11为我们提供了mutex等相关类来保护临界资源&#xff0c;保证某一时刻只有一个线程可以访问临界资源。主要包括各种mutex&#xff0c;他们的命名大都是xx_mutex。以及RAII风格的wrapper类&#xff0c;RAII就是一般在构造的时…

光伏设计——光伏合作的几种方式

鹧鸪云 随着光伏产业的发展&#xff0c;越来越多的企业和组织选择通过合作来提高效率、降低成本、实现共赢。以下是几种常见的光伏合作方式&#xff1a; 合资企业&#xff1a;合资企业是一种常见的合作方式&#xff0c;两个或多个公司共同出资、共同经营&#xff0c;共享利润和…

学习笔记-李沐动手学深度学习(四)(12-13,权重衰退、L2正则化、Dropout)

总结 【trick】过拟合及正则化项参数的理解 实际数据都有噪音&#xff0c;一般有噪音后&#xff0c;模型实际学习到的权重w就会比 理论上w的最优解&#xff08;即没有噪音时&#xff09;大。&#xff08;QA中讲的&#xff09; 【好问题】 &#xff08;1&#xff09;不使用正…

Java强训day4(选择题编程题)

选择题 接口中的方法是为了让重写编程题 题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a_b sc.nextInt();int b_c sc.nextInt();int ab sc.nextInt();int bc sc.nextInt();for(in…

HttpHeaders 源码中headers成员变量为什么声明为final

源码如下 public class HttpHeaders implements MultiValueMap<String, String>, Serializable {private final Map<String, List<String>> headers;public String getFirst(String headerName) {List<String> headerValues (List)this.headers.get(…

THM学习笔记——OSI模型和TCP/IP模型

全是文字 比较枯燥 建议视频 OSI模型由七个层次组成&#xff1a; 第7层 -- 应用层&#xff1a; OSI模型的应用层主要为在计算机上运行的程序提供网络选项。它几乎专门与应用程序一起工作&#xff0c;为它们提供一个界面以用于传输数据。当数据传递到应用层时&#xff0c;它…

3dmax效果图渲染出现曝光怎么解决?

在使用3ds Max完成效果图渲染工作时&#xff0c;有时会遇到曝光过度的问题&#xff0c;这会使得渲染的图像出现光斑或者过亮&#xff0c;损害了效果的真实感和美观度。那么解决解决3dmax曝光问题呢&#xff1f;一起看看吧&#xff01; 3dmax效果图渲染出现曝光解决方法 1、相机…

yml配置文件怎么引用pom.xml中的属性

目录 前言配置测试 前言 配置文件中的一些参数有时要用到pom文件中的属性&#xff0c;做到pom文件变配置文件中也跟着变&#xff0c;那如何才能做到呢&#xff0c;下面咱们来一起探讨学习。 配置 1.首先要在pom.xml中做如下配置&#xff0c;让maven渲染src/main/resources下配…

YOLOv5全网独家首发:Powerful-IoU更好、更快的收敛IoU,效果秒杀CIoU、GIoU等 | 2024年最新IoU

💡💡💡本文独家改进:Powerful-IoU更好、更快的收敛IoU,是一种结合了目标尺寸自适应惩罚因子和基于锚框质量的梯度调节函数的损失函数 💡💡💡MS COCO和PASCAL VOC数据集实现涨点 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_1251193…