Java8 Lambda 表达式

news2024/11/26 3:28:20

文章目录

  • 🍉 `Java 8` 介绍
  • 🍉 `Lambda` 表达式
    • 🍅🍅 基础语法
    • 🍅🍅 案例
  • 🍉 函数式接口
    • 🍅🍅 内置的四大核心函数式接口
    • 🍅🍅 案例


在这里插入图片描述

🍉 Java 8 介绍


Java8是2014年发布的版本,是Java5以来具有革命性的版本。

Java 8的主要新语法特性如下

  1. Lambda表达式
    Lambda表达式使Java程序员能够编写更加简洁、易读和易维护的代码。它是一种匿名函数,可以将其作为参数传递给其他方法或函数。

  2. 方法引用
    方法引用是指通过名称来引用现有的方法,从而让代码变得更简洁、易读和易于维护。Java 8中提供了四种不同的方法引用方式:静态方法引用、实例方法引用、构造器引用和超类方法引用。

  3. 接口默认方法
    Java 8允许在接口中定义具体实现的默认方法,这样实现类就可以继承该方法的实现,避免了因为新增方法而导致向所有实现类迁移代码的麻烦。

  4. 函数式接口
    函数式接口仅包含一个抽象方法的接口,它是Java 8中Lambda表达式的基础。Java 8中提供了许多常用的函数式接口,例如:Predicate、Function、Consumer等。

  5. Stream API
    Stream API是Java 8中一个强大的工具,它允许程序员轻松处理集合数据。使用流API可以实现筛选、排序、映射、归约等操作,让代码更加简洁、易读和易于维护。

  6. 时间API
    Java 8中引入了新的时间API,它提供了一种更好的方式来处理日期和时间。这个API包含多个类,可以用来处理日历、时间、时区和持续时间等问题。

  7. Optional 类型
    Optional类型是一个容器对象,可以包含null或非null值。它为程序员提供一种优雅的方式来处理null检查,从而避免NullPointerException异常。

这些新语法都带来了很大的变化,使得Java编程更加简洁、高效、可读性强和易于维护。


🍉 Lambda 表达式

Lambda是 一个 匿名函数,我们可以把Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

🍅🍅 基础语法

Java8引入了一个新的操作符: ->,该操作符称为箭头操作符或 Lambda 操作符,箭头操作符将Lambda 表达式拆分为2部分:

  1. 左侧:Lambda 表达式的 参数列表
  2. 右侧:Lambda 表达式中 所执行的功能,即 Lambda 体

语法格式1:无参数,无返回值

public class test {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello World!");
            }
        };
        r.run();

        System.out.println("--------------------------------------");
        Runnable r1 = () -> System.out.println("Hello Lambda");
        r1.run();
    }
}

语法格式2:有一个参数,并且无返回值,小括号可省略不写,:

public class test {
    public static void main(String[] args) {
        Consumer<String> con = x -> System.out.println(x);
        con.accept("SNOW");
    }
}

语法格式3:有2个以上的参数,有返回值,并且Lambda体中有多条语句 ,有返回值

public class test {
    public static void main(String[] args) {
        Comparator<Integer> com = (x,y) -> {
            System.out.println("函数式接口");
            return Integer.compare(x,y);
        };
    }
}

语法格式4:若Lambda体中只有一条语句,return和大括号都可省略不写

public class test {
    public static void main(String[] args) {
        Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
    }
}

语法格式5:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,即“类型推断”

Lambda表达式需要 函数式接口 的支持!(函数式接口:接口中只有一个抽象方法的接口,称为函数式接口,可以使用 @FunctionalInterface 修饰。)

🍅🍅 案例

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private String name;
    private int age;
    private Double salary;
}
public class test {
    public static void main(String[] args) {
        List<Employee> list = Arrays.asList(
                new Employee("1号", 25, 5000.0),
                new Employee("2号", 35, 3000.0),
                new Employee("3号", 35, 2000.0),
                new Employee("4号", 35, 8000.0),
                new Employee("5号", 65, 1000.0)
        );
        Collections.sort(list,(e1,e2)->{
            if (e1.getAge() == e2.getAge()){
                return e1.getName().compareTo(e2.getName());
            }else {
                // 倒序
                return -Integer.compare(e1.getAge(),e2.getAge());
            }
        });
        Iterator<Employee> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

🍉 函数式接口

🍅🍅 内置的四大核心函数式接口

  1. Consumer:消费型接口 void accept(T t);
  2. Supplier:供给型接口 T get();
  3. Function(T,R):函数型接口 R apply(T t);
  4. Predicate:断言型接口 boolean test(T t);

🍅🍅 案例

  1. Consumer:消费型接口
@Test
public void test(){
    this.happy(1000,m -> {
        System.out.println("我消费了"+ m);
    });
}

public void happy(double money, Consumer<Double> con){
    con.accept(money);
}
  1. Supplier:供给型接口
@Test
public void test(){
    List<Integer> numList = this.getNumList(5, () -> (int) (Math.random() * 100));
    for (Integer integer : numList) {
        System.out.println(integer);
    }
}

//产生指定数量的整数
public List<Integer> getNumList(int num, Supplier<Integer> sup){
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < num; i++) {
        list.add(sup.get());
    }
    return list;
}
  1. Function(T,R):函数型接口
@Test
public void test(){
    System.out.println(this.handler("str", str -> (str + "123")));
}

//处理字符串
public String handler(String str, Function<String,String> fun){
    return fun.apply(str);
}
  1. Predicate:断言型接口
@Test
public void test(){
    List<String> stringList = Arrays.asList("qwe", "123", "hello", "ranhaifeng", "asdasdsaewqewqe");
    List<String> list = filterStr(stringList, s -> (s.length() > 3));
    for (String s : list) {
        System.out.println(s);
    }
}

//将满足条件的字符串放入集合
public List<String> filterStr(List<String> list, Predicate<String> pre){
    List<String> stringList = new ArrayList<>();
    for (String s : list) {
        if (pre.test(s)){
            stringList.add(s);
        }
    }
    return stringList;
}




在这里插入图片描述



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

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

相关文章

linux驱动(一):led

本文主要探讨210的led驱动相关知识。 驱动 操作系统驱动硬件的代码,驱动上层是系统调用API,下层是硬件 宏内核&#xff1a;内核整体上为一个过程实现,运行在同一地址空间,相互调用简单高效 微内核&#xff1a;功能为独立过程,过程间通过IPC通信 …

国科大图像处理2023速通期末——汇总2017-2019

国科大2023.12.28图像处理0854期末重点 图像处理 王伟强 作业 课件 资料 一、填空 一个阴极射线管它的输入与输出满足 s r 2 sr^{2} sr2&#xff0c;这将使得显示系统产生比希望的效果更暗的图像&#xff0c;此时伽马校正通常在信号进入显示器前被进行预处理&#xff0c;令p…

上海亚商投顾:三大指数红盘收官!沪指今年累计跌3.7%

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 A股12月29日迎来2023年收官之战&#xff0c;三大股指延续反弹走势&#xff0c;最终集体红盘报收。纵观全年&am…

CMake入门教程【基础篇】CMake+vs2022+nmake构建项目

文章目录 1.vs编译器下载安装2.运行nmake测试3.CMake下载安装4.运行CMake测试5.使用CMakeNMake构建项目代码目录代码实现 6.运行项目 1.vs编译器下载安装 下载地址 :https://visualstudio.microsoft.com/zh-hans/vs/ 点击截图处下载 勾选红框的内容即可 安装 2.运行nmak…

echarts手动触发气泡的显示和隐藏

点击echarts图表后将点击的那个进行突出显示 <template><div id"demo"> </div><el-button type"primary" click"set">设置</el-button><el-button type"primary" click"cancel">取消&…

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)四

第二部分、线性表详解&#xff1a;数据结构线性表10分钟入门 线性表&#xff0c;数据结构中最简单的一种存储结构&#xff0c;专门用于存储逻辑关系为"一对一"的数据。 线性表&#xff0c;基于数据在实际物理空间中的存储状态&#xff0c;又可细分为顺序表&#xff…

嵌入式视频播放器(mplayer)

1.文件准备&#xff1a; MPlayer-1.0rc2.tar.bz2 libmad-0.15.1b.tar.gz 直接Git到本地 git clone https://gitee.com/zxz_FINE/mplayer_tarball.git 2.文件夹准备&#xff1a; src存放解压后的源码文件&#xff0c;target_Mplayer存放编译安装的目标文件 mkdir src targe…

自动驾驶论文

文章目录 一、Convolutional Social Pooling for Vehicle Trajectory Prediction二、QCNet&#xff1a;Query-Centric Trajectory Prediction三、VectorNet: Encoding HD Maps and Agent Dynamics from Vectorized Representation 一、Convolutional Social Pooling for Vehicl…

Ts自封装WebSocket心跳重连

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;允许客户端和服务器之间进行双向实时通信。 所谓心跳机制&#xff0c;就是在长时间不使用WebSocket连接的情况下&#xff0c;通过服务器与客户端之间按照一定时间间隔进行少量数据的通信来达到确认连接稳定的手…

【快速全面掌握 WAMPServer】12.WAMPServer 故障排除经验大总结

网管小贾 / sysadm.cc 众所周知&#xff0c;搞开发需要先搭建相应的编程和调试环境。 对于 PHPer 来说&#xff0c;很多像我一样的新手小白们入门的时候&#xff0c;通常会选择一些集成开发环境包&#xff0c;其中就有 WampServer 。 集成环境包被许多人所诟病&#xff0c;说…

防火墙-访问控制、安全审计、网络设备防护检查表

防火墙标准检查表 项目管理、开发全文档获取&#xff1a;软件项目开发全套文档下载_软件项目技术实现文档-CSDN博客 1、访问控制类检查 2、安全审计类检查 3、网络设备防护类检查 防火墙标准检查表 分类 测评项 预期结果 访问控制 应在网络边界部署访问控制设备&#xf…

QT的信号与槽

QT的信号与槽 文章目录 QT的信号与槽前言一、QT 打印"hello QT"的dome二、信号和槽机制&#xff1f;二、信号与槽的用法1、QT5的方式1. 无参的信号与槽的dome2.带参的信号与槽dome 2、QT4的方式3、C11的语法 Lambda表达式1、函数对象参数2、操作符重载函数参数3、可修…

爬虫实战-微博评论爬取

简介 最近在做NLP方面的研究&#xff0c;以前一直在做CV方面。最近由于chatgpt&#xff0c;所以对NLP就非常感兴趣。索性就开始研究起来了。 其实我们都知道&#xff0c;无论是CV方向还是NLP方向的模型实现&#xff0c;都是离不开数据的。哪怕是再先进的代码&#xff0c;都是…

红队攻防实战之DC2

吾愿效法古圣先贤&#xff0c;使成千上万的巧儿都能在21世纪的中华盛世里&#xff0c;丰衣足食&#xff0c;怡然自得 0x01 信息收集: 1.1 端口探测 使用nmap工具 可以发现开放了80端口&#xff0c;网页服务器但是可以看出做了域名解析&#xff0c;所以需要在本地完成本地域名…

车载毫米波雷达及芯片新趋势研究3--自动驾驶、国产替代与外延场景需求快速增长打开市场空间

3.1 多传感器融合路线优势将不断扩大&#xff0c;引发更多毫米波雷达及芯片需求  纯视觉自动驾驶路线是通过以光学摄像头为传感器结合大量算法训练以模拟人类视觉驾驶为逻辑的自动驾驶方案。 纯视觉方案“轻硬件、重软件”&#xff0c;由其采用的摄像头成本较低&#xff0c;…

大数据Doris(四十五):物化视图选择最优

文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…

vmware安装openEuler 22.03 LTS操作系统

vmware安装openEuler 22.03 LTS操作系统 1、下载openEuler操作系统镜像文件2、安装openEuler操作系统3、配置openEuler操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载openEuler操作系统镜像文件 官网下载链接 链接: https://www.openeuler.or…

2024年PMP考试新考纲-PMBOK第七版-【模型、方法和工件】真题解析(4)

今天是2024年1月2日&#xff0c;2024年年的第一个工作日&#xff0c;祝大家愉快、进步&#xff01;我们继续来看第七版PMBOK第四部分【模型、方法和工件】这个章节相关的真题。 这几天有几个小伙伴问华研荟&#xff0c;是不是一定要先看PMP的教材&#xff08;这里的教材指的是…

洛谷 P1160 队列安排

题目描述 一个学校里老师要将班上 N 个同学排成一列&#xff0c;同学被编号为 1∼N&#xff0c;他采取如下的方法&#xff1a; 先将 11 号同学安排进队列&#xff0c;这时队列中只有他一个人&#xff1b; 2∼N 号同学依次入列&#xff0c;编号为 i 的同学入列方式为&#xff…

基于Flutter构建小型新闻App

目录 1. 概述 1.1 功能概述 1.2 技术准备 1.3 源码地址 2. App首页 2.1 pubspec依赖 2.2 热门首页组件 2.2.1 DefaultTabController 2.2.2 Swiper 2.3 新闻API数据访问 2.4 热门首页效果图 3. 新闻分类 3.1 GestureDetector 3.2 新闻分类效果图 4. 收藏功能 4…