Java知识点整理 18 — Lambda表达式

news2024/12/27 10:54:02

一. 简介

Lambda 表达式是函数式编程思想的体现,强调做什么,而不是以什么方式去做。

面向对象编程思想强调的是对象,必须通过对象的形式来做一些事情。比如多线程执行任务,需要创建对象,对象需要实现指定接口,然后再执行等。过程相对繁琐。而如果使用函数式编程思想,可以直接通过传递一段代码给线程对象执行,不需要创建任务对象。

Lambda 表达式可以被视为匿名函数,允许在需要函数的地方以更简洁的方式定义功能

因此只要是函数式接口,就可以使用 Lambda 表达式简化。

函数式接口指的是接口中有且只有一个未实现的方法。如果超过一个,则不是函数式接口;如果有一个默认实现方法,一个未实现的方法,也是函数式接口。

// 接口中有超过一个未实现方法,不是函数式接口
interface MyInterface {
    int sum(int a, int b);
    int min(int a, int b);
}

// 接口中只有一个未实现的方法,是函数式接口
interface MyCase{
    int hello();
    default int hello(int a){return a;} //默认实现
}

可以用 JDK 中提供的检查注解 @FunctionalInterface 来检查该接口是否为函数式接口。

正常情况下:

异常情况下:

 二. Lambda 表达式的格式

1. 标准格式

( 参数列表 )-> { 代码 }

2. 格式说明

小括号内是参数列表,语法与传统方法参数列表一致,没有参数就留空,有多个就用逗号分隔。

箭头符号 ->,代表指向动作。

大括号内是业务逻辑代码,语法与传统方法体一致。

3. 举例

创建线程

// 传统方式
Thread thread1 = new Thread(new Runnable() {
    @Override
    public void run () {
       System.out.println("线程需要执行的任务代码1");
    }
});
thread1.start();
 
// Lambda表达式
Thread t2 = new Thread(()->{
    System.out.println("线程需要执行的任务代码2");
});
t2.start();

比较器

List<Integer> list = new ArrayList<>();
Collections.addAll(list,11,22,33,44,55);
System.out.println("排序之前的集合:" + list);
        
// 传统方式
Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare (Integer o1, Integer o2) {
        return o2-o1;
    }
});
 
// Lambda表达式
Collections.sort(list,(Integer o1, Integer o2)->{return o2-o1;});
System.out.println("排序之后的集合:" + list);

三. Lambda 表达式与函数式接口

假如有一个接口 MyInterface,里面有一个方法 sum(),

interface MyInterface {
    int sum(int a, int b);
}

想要实现这个接口,有两种方法:

1. 自己写实现类

class MyInterfaceImpl implements MyInterface {
    @Override
    public int sum(int a, int b) {
        return a + b;
    }
}

然后调用,

public class Lambda {
    public static void main(String[] args) {
        MyInterface myInterface = new MyInterfaceImpl();
        int result = myInterface.sum(1, 2);
        System.out.println(result);
    }
}

2. 创建匿名实现类

每个接口都去写对应的实现类相对麻烦,因此可以采用匿名实现类动态的去实现接口

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

        // 1. 自己创建实现类对象
        MyInterface myInterface = new MyInterfaceImpl();
        int result = myInterface.sum(1, 2);
        System.out.println("自己创建的实现类对象 " + result);

        // 2. 创建匿名实现类
        MyInterface myInterface1 = new MyInterface() {
            @Override
            public int sum(int a, int b) {
                return a*a + b*b;
            }
        };
        int result1 = myInterface1.sum(1, 2);
        System.out.println("匿名实现类 " + result1);
    }
}

在匿名实现类中,很多格式上的东西都是固定的,因此可以进一步简化,只保留动态的东西,比如参数、方法体内容等,

// 2. 匿名实现类
MyInterface myInterface1 = new MyInterface() {
    @Override
    public int sum(int a, int b) {
       return a*a + b*b;
    }
};

// 3. Lambda表达式实现接口  参数列表 + 箭头 + 方法体
MyInterface myInterface2 = (int a, int b) -> {
    return a * a + b * b;
};

进一步思考,其实参数类型也是固定的,还可以再简化,

MyInterface myInterface3 = (x, y) -> {
     return x * x + y * y;
};

参数名不一定是接口中定义的(a,b),也可以是其它名字,比如(x,y)。

此外,参数部分如果为空,可以留空,即只写一个(),但不能不写括号;或者如果只有一个参数,可以只写一个参数名,

// 入参为控
interface MyCase1{
    int hello();
}

public class Lambda {
    public static void main(String[] args) {
        MyCase myCase1 = () -> {
            return 1;
        };
    }
}

// 只有一个参数 a
interface MyCase2{
    int hello(int a);
}

public class Lambda {
    public static void main(String[] args) {
        MyCase1 myCase2 = a -> {
            return a + 1;
        };
    }
}

方法体如果只有一句话,{ } 和 return 可以省略,

interface MyCase2{
    int hello(int a);
}

public class Lambda {
    public static void main(String[] args) {
        MyCase1 myCase2  = a ->  a + 2;
        // 调用方法
        System.out.println(myCase2.hello(1));
    }
}

四. Lambda 表达式的表现形式 

1. 变量形式

变量的类型为函数式接口(不常用)

// 变量的形式
Runnable r = ()->{
    System.out.println("任务代码");
};
// 函数式接口类型的变量
Thread t = new Thread(r);

2. 参数形式

方法的形参类型为函数式接口(常用)

// 变量的形式-比较器
Comparator<Integer> comparable = (o1, o2)->{return o2 - o1;};

// 创建集合
ArrayList<Integer> list = new ArrayList<>();

// 存入数据
Collections.addAll(list,11,22,33,44,55);
 
// 将函数式接口类型的形参类型,传给Collections
Collections.sort(list,comparable);

3. 返回值形式

方法的返回值类型为函数式接口(常用)

// 定义一个方法
public static Comparator<Integer> getComparator(){
     return (Integer o1,Integer o2)->{return  o2-o1;};
}
        
public static void main (String[] args) {
   // 返回值形式
   Collections.sort(list,getComparator());
}

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

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

相关文章

【吴恩达机器学习-week2】可选实验:使用 Scikit-Learn 进行线性回归

支持我的工作 &#x1f389; &#x1f4c3;亲爱的朋友们&#xff0c;感谢你们一直以来对我的关注和支持&#xff01; &#x1f4aa;&#x1f3fb; 为了提供更优质的内容和更有趣的创作&#xff0c;我付出了大量的时间和精力。如果你觉得我的内容对你有帮助或带来了欢乐&#xf…

看完这篇文章你就知道什么是未来软件开发的方向了!即生成式AI在软件开发领域的革新=CodeFlying

从最早的UGC&#xff08;用户生成内容&#xff09;到PGC&#xff08;专业生成内容&#xff09;再到AIGC&#xff08;人工智能生成内容&#xff09;体现了web1.0→web2.0→web3.0的发展历程。 毫无疑问UGC已经成为了当前拥有群体数量最大的内容生产方式。 同时随着人工智能技术…

SAP 表字段调整,表维护生成器调整

表维护生成器->已生成的对象->更改->专家模式

Linux下的wifi开发

了解什么是wifi 可参考&#xff1a; 什么是Wi-Fi&#xff1f;Wi-Fi和WLAN的区别是什么&#xff1f; - 华为 (huawei.com) WLAN的基本元素 工作站STA&#xff08;Station&#xff09;&#xff1a;支持802.11标准的终端设备。例如带无线网卡的电脑、支持WLAN的手机等。 接入点AP&…

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…

数学建模--层次分析法~~深入解读

目录 1.基本概念 &#xff08;1&#xff09;研究案例 &#xff08;2&#xff09;模型框架 &#xff08;3&#xff09;阐述说明 &#xff08;4&#xff09;注意事项 2.模型的建立和求解 &#xff08;1&#xff09;数量级的统一 &#xff08;2&#xff09;归一化处理 &am…

用Vue3和Rough.js绘制一个粗糙的3D条形图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Rough.js 和 D3.js 绘制粗糙手写风格条形图 应用场景 该代码适用于需要在 Web 应用程序中创建具有粗糙手写风格的条形图的情况。它可以用于数据可视化、信息图表或任何需要以独特和有吸引力的方式呈现数…

Java StringBuffer类和StringBuilder类

在使用 StringBuffer 类时&#xff0c;每次都会对 StringBuffer 对象本身进行操作&#xff0c;而不是生成新的对象&#xff0c;所以如果需要对字符串进行修改推荐使用 StringBuffer。 StringBuilder 类在 Java 5 中被提出&#xff0c;它和 StringBuffer 之间的最大不同在于 St…

【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss

cross_entropy计算误差方式&#xff0c;输入向量z为[1,2,3]&#xff0c;预测y为[1]&#xff0c;选择数为2&#xff0c;计算出一大坨e的式子为3.405&#xff0c;再用-23.405计算得到1.405MSE计算误差方式&#xff0c;输入z为[1,2,3]&#xff0c;预测向量应该是[1,0,0]&#xff0…

IAR工程目录移动报错(改变文件目录结构)

刚开始用IAR&#xff0c;记录一下。 工作中使用华大单片机&#xff0c;例程的文件目录结构太复杂了想精简一点。 1.如果原本的C文件相对工程文件&#xff08;.eww文件&#xff09;路径变化了&#xff0c;需要先打开工程&#xff0c;再将所有的.c文件右键Add添加进工程&#xf…

【Godot4.2】Godot中的贝塞尔曲线

概述 通过指定平面上的多个点&#xff0c;然后顺次连接&#xff0c;我们可以得到折线段&#xff0c;如果闭合图形&#xff0c;就可以获得多边形。通过向量旋转我们可以获得圆等特殊图形。 但是对于任意曲线&#xff0c;我们无法使用简单的方式来获取其顶点&#xff0c;好在计…

X-ObjectMount: 对象存储访问接入的新选择

XEOS 自 2017 年发布面世以来&#xff0c;历经 7 年的研发迭代&#xff0c;上个月正式发布了 XSKY SDS 6.4 版本&#xff0c;包含了最新的多站点统一命名空间能力&#xff0c;也标志了 XEOS 在对象存储领域的全方面优势和领先市场地位。 在 XSKY 过去对象存储服务历程里&#…

mysql 命令 —— 查看表信息(show table status)

查询表信息&#xff0c;如整个表的数据量大小、表的索引占用空间大小等 1、查询某个库下面的所有表信息&#xff1a; SHOW TABLE STATUS FROM your_database_name;2、查询指定的表信息&#xff1a; SHOW TABLE STATUS LIKE your_table_name;如&#xff1a;Data_length 显示表…

openGauss真的比PostgreSQL差了10年?

前不久写了MogDB针对PostgreSQL的兼容性文章&#xff0c;我在文中提到针对PostgreSQL而言&#xff0c;MogDB兼容性还是不错的&#xff0c;其中也给出了其中一个能源客户之前POC的迁移报告数据。 But很快我发现总有人回留言喷我&#xff0c;而且我发现每次喷的这帮人是根本不看文…

Python基础003

Python流程控制基础 1.条件语句 内置函数input a input("请输入一段内容&#xff1a;") print(a) print(type(a))代码执行的时候遇到input函数&#xff0c;就会等键盘输入结果&#xff0c;已回车为结束标志&#xff0c;也就时说输入回车后代码才会执行 2.顺序执行…

【问题记录】如何在xftp上查看隐藏文件。

显示隐藏的文件夹 用xftp连接到服务器后&#xff0c;发现有些隐藏的文件夹并未显示出来&#xff0c;通过以下配置&#xff0c;即可使隐藏的文件夹给显示出来。 1.点击菜单栏的"小齿轮"按钮&#xff1a; 2.勾选显示隐藏的文件夹&#xff1a; 3.点击确定即可。

古韵流光:探秘五代耀州窑青瓷提梁倒灌壶的奇妙设计

在陕西历史博物馆的静谧展厅中&#xff0c;一件千年前的瓷器静静陈列&#xff0c;它不仅承载着历史的沉淀&#xff0c;更凝聚了古代匠人的非凡智慧。这便是五代时期的耀州窑青瓷提梁倒灌壶&#xff0c;一件巧夺天工的艺术品&#xff0c;其独特的设计至今仍让人叹为观止。 一、倒…

算法mq 交互通用校验模块设计

背景 当前与算法交互均通过rocketMQ异步交互&#xff0c;绝大部分场景一条请求mq消息应对应一条返回mq&#xff0c;但由于各种原因&#xff08;消息积压、程序bug&#xff09;&#xff0c;可能会导致返回mq超时未返回或者消息丢失。工程侧针对一些重要场景 case by case的通过…

【web3】分享一个web入门学习平台-HackQuest

前言 一直想进入web3行业&#xff0c;但是没有什么途径&#xff0c;偶然在电鸭平台看到HackQuest的共学营&#xff0c;发现真的不错&#xff0c;并且还接触到了黑客松这种形式。 链接地址&#xff1a;HackQuest 平台功能 学习路径&#xff1a;平台有完整的学习路径&#xff…

VS2022+Qt+OpenCV Debug模式下,循环中格式转换引起的内存异常问题 debug_heap.cpp

文章目录 前言一、问题二、报错1.提示图片2.提示堆栈3.反汇编位置 三、解决办法总结 前言 最近在使用VS2022&#xff0c;C&#xff0c;OpenCV&#xff0c;Qt开发时&#xff0c;遇到了一个疑难杂症-在循环中执行字符串格式转换会触发内存异常&#xff0c;经过痛苦的排查过程&am…