深入了解Java 8 新特性:lambda表达式基础

阅读建议

嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:

  1. 本篇文章大概000多字,预计阅读时间长需要5分钟。
  2. 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
  3. 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。

了解lambda表达式

        Java 8中的Lambda表达式是一种匿名函数,它允许你将函数作为方法参数进行传递,或者把代码更简洁地定义在你的应用程序里。另外Java的函数式编程就是Lambda表达式,java的函数式接口的有一个明显特征:有且仅有一个抽象方法的接口。

语法

标准语法

        Lambda表达式的语法基本形式如下:

(parameters) -> expression

        Lambda表达式在Java语言中引入了一个操作符“->”,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:

  • 左侧:指定了Lambda表达式需要的所有参数
  • 右侧:制定了Lambda体,即Lambda表达式要执行的功能。

简写语法

        语法格式一:无参,无返回值,Lambda体只需一条语句。如下:

@Test
public void test01(){
    Runnable runnable=()-> System.out.println("hello world");
    runnable.run();//结果:hello world
}

        语法格式二:Lambda需要一个参数,无返回值。如下:

@Test
public void test02(){
    Consumer<String> consumer=(x)-> System.out.println(x);
    consumer.accept("Hello world");//结果:Hello world
}

        语法格式三:Lambda只需要一个参数时,参数的小括号可以省略,如下:

public void test03(){
    Consumer<String> consumer=x-> System.out.println(x);
    consumer.accept("Hello world");//结果:Hello world
}

        语法格式四:Lambda需要两个参数,并且Lambda体中有多条语句。

@Test
public void test04(){
    Comparator<Integer> com=(x, y)->{
        System.out.println("Hello world");
        return Integer.compare(x,y);
    };
    System.out.println(com.compare(2,4));//结果:-1
}

        语法格式五:有两个以上参数,有返回值,若Lambda体中只有一条语句,return和大括号都可以省略不写

@Test
public void test05(){
    Comparator<Integer> com=(x, y)-> Integer.compare(x,y);
    System.out.println(com.compare(4,2));//结果:1
}

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

@Test
public void test06(){
    Comparator<Integer> com=(Integer x, Integer y)-> Integer.compare(x,y);
    System.out.println(com.compare(4,2));//结果:1
}

方法的引用

使用方法引用的前提

  • 方法引用所引用的方法的参数列表必须要和函数式接口中抽象方法的参数列表相同(完全一致)。
  • 方法引用所引用的方法的的返回值必须要和函数式接口中抽象方法的返回值相同(完全一致)。

方法引用一般有三种格式

  • 调用构造方法:调用类的构造方法,使用lambda表达工可以简写为:类名::new,这里需要注意的是函数式接口的参数类型、返回值类型要与所引用的方法保持一致
@FunctionalInterface
public interface MyFunction<R> {
    R execute();
}
@FunctionalInterface
public interface MyFunction2<T,R> {
    R execute(T T);
}
@Test
public void test07() {
    //无参数的构造方法
    MyFunction<Student> myFunction=Student::new;
    Student student = myFunction.execute();
    //有参数的构造方法
    MyFunction2<String,Student> myFunction2=Student::new;
    student = myFunction2.execute("zhangsan");
}
  • 调用静态方法:调用类的静态方法,使用lambda表达工可以简写为:类名::静态方法名,这里需要注意的是函数式接口的参数类型、返回值类型要与所引用的方法保持一致
@FunctionalInterface
public interface MyFunction {
    void execute();
}

@FunctionalInterface
public interface MyFunction2<T, R> {
    R execute(T T);
}

@Test
public void test07() {
    MyFunction myFunction = Student::play;//play()是无参数无返回值静态方法
    MyFunction2<String, String> myFunction2 = Student::show;//有参数有返回值的静态方法
}
  • 调用实例方法:调用类的实例方法有两种写法,第一种:对象类::实例方法名;第二种:类名::实例方法名;两种方法的区别在于函数式接口的参数类型不同,如果是类名::实例方法名,表达式表面上没有传参数,实际上是要接收一个实例对象作为参数的;
@FunctionalInterface
public interface MyFunction<R> {
    R execute();
}

@FunctionalInterface
public interface MyFunction2<T, R> {
    R execute(T T);
}

@Test
public void test07() {
    Student student = new Student("张三");
    MyFunction<String> myFunction = student::getName;
    String name = myFunction.execute();
    MyFunction2<Student, String> myFunction2 = Student::getName;
    name = myFunction2.execute(student);
}

自定义函数式接口

        自定义函数接口很容易,只需要编写一个只有一个抽象方法的接口即可。代码中的@FunctionalInterface是可选的,但加上该标注编译器会帮你检查接口是否符合函数接口规范。就像加入@Override标注会检查是否重载了函数一样。

@FunctionalInterface
public interface MyFunction2<T, R> {
    R execute(T T);
}

应用场景

        Java的Lambda表达式是一种简洁的函数式编程语法,它允许将简单的函数作为一种数据类型传递,是Java语言向函数式编程迈进的重要一步。在实际的应用过程,有很多场景可以使用lambda表达式,如:

  • 简化代码:Lambda表达式可以使代码更加简洁、易读和易于维护。通过使用Lambda表达式,可以将匿名内部类的代码简化为一个简洁的表达式。
  • 流式编程:Java 8引入了流API,可以使用Lambda表达式对集合进行过滤、映射、排序等操作。Lambda表达式使得流式编程更加简洁和直观。
  • 回调函数:Lambda表达式可以作为回调函数使用,例如在GUI应用程序中,可以使用Lambda表达式作为按钮点击事件的回调函数。
  • 排序和比较:Lambda表达式可以用于定义对象的排序规则和比较方法。例如,可以使用Lambda表达式定义一个自定义的排序规则,按照某个属性进行排序。
  • 函数式接口:Lambda表达式可以用于实现函数式接口,即只有一个抽象方法的接口。例如,可以使用Lambda表达式实现Comparator接口,以便对集合进行排序。
  • 并发编程:Lambda表达式可以用于实现线程池中的任务。通过使用Lambda表达式,可以更方便地创建并发任务,而无需创建额外的类。
  • 事件处理:在事件驱动的系统中,可以使用Lambda表达式作为事件处理程序。例如,在Web应用程序中,可以使用Lambda表达式处理HTTP请求或响应。

优点和缺点

        Java 8的新特性Lambda表达式功能很强大,它为Java带来了函数式编程的特性。从不同的层面来看,有很多的优点,也存在一些缺点,这需要在使用的时候特别注意,以下仅供参考:

        优点:

  1. 简洁:Lambda表达式可以极大地简化代码,尤其是对于一些简单的函数式编程任务。通过使用Lambda表达式,可以避免编写冗长且难以理解的匿名内部类。
  2. 可读性强:Lambda表达式通常更容易理解,尤其是对于那些熟悉函数式编程的开发者来说。通过使用Lambda表达式,可以将代码的意图更清晰地表达出来。
  3. 灵活性高:Lambda表达式提供了更大的灵活性,可以在运行时动态地改变代码的行为。这使得Lambda表达式非常适合于实现一些复杂的逻辑。
  4. 提高性能:Lambda表达式在某些情况下可以提高代码的性能。这是因为Lambda表达式可以避免创建不必要的对象,从而减少了垃圾回收的压力。
  5. 易于测试:由于Lambda表达式只是一个函数,因此可以更容易地对它们进行单元测试。

        缺点:

  1. 学习曲线陡峭:对于那些不熟悉函数式编程的开发者来说,Lambda表达式可能需要一些时间来理解和学习。这可能需要他们在初期投入更多的时间和精力。
  2. 不适合所有情况:虽然Lambda表达式在某些情况下可以提高性能,但在其他情况下可能会降低性能。例如,如果Lambda表达式中包含了复杂的操作或者有大量的数据传递,那么使用Lambda表达式可能会比使用传统的循环或者方法调用更加耗时。
  3. 调试困难:当Lambda表达式出现问题时,调试可能会更加困难。这是因为Lambda表达式可能涉及到多个不同的函数和方法,而且可能难以确定问题的具体位置。
  4. 语法糖衣:Lambda表达式实际上是一种语法糖衣,它使得函数式编程更加易于理解,但在某些情况下可能会掩盖代码的真实意图。这可能会导致代码的可维护性和可读性降低。

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

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

相关文章

数据库选型与优化:策略与技巧的探讨

大家好&#xff0c;我是一名狂热的数据库程序员&#xff0c;最近鼓起勇气开始吐槽一下数据库&#xff0c;如有雷同&#xff0c;请对号入座。 名不副实的数据库类型 先说说最近的事&#xff0c;我们业务有很多图片要管理&#xff0c;老板说让我选个专业的图数据库&#xff0c;…

【LeetCode刷题-双指针】--360.有序转化数组

360.有序转化数组 方法&#xff1a;双指针 从两头计算&#xff0c;保存两端较小的值&#xff0c;高中抛物线知识&#xff0c;a>0&#xff0c;向上的抛物线&#xff0c;两端大中间小&#xff0c;从后往前存储计算结果&#xff1b;a<0&#xff0c;向下的抛物线&#xff0c…

[MySQL] MySQL表的约束

在前面的文章中提到了约束&#xff0c;是通过数据类型对字段产生的约束。但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。于是就引入了表的约束。 表的约束很多&#xff0c;这里主要介…

​软考-高级-系统架构设计师教程(清华第2版)【第17章 通信系统架构设计理论与实践(P614~646)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第17章 通信系统架构设计理论与实践&#xff08;P614~646&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

Vue3 函数式弹窗

运行环境 vue3vitetselement-plus 开发与测试 1. 使用h、render函数创建Dialog 建议可在plugins目录下创建dialog文件夹&#xff0c;创建index.ts文件&#xff0c;代码如下 import { h, render } from "vue";/*** 函数式弹窗* param component 组件* param opti…

强化学习在文生图中的应用:Training Diffusion Models with Reinforcement Learning

论文链接:Training Diffusion Models with Reinforcement Learning项目地址:Training Diffusion Models with Reinforcement Learning官方代码:https://github.com/kvablack/ddpo-pytorch/tree/maintrl实现:https://huggingface.co/docs/trl/ddpo_trainer🤗关注公众号 fu…

口袋参谋:一键下载任意买家秀图片、视频,是怎么做到的!

​对于淘宝商家来说&#xff0c;淘宝买家秀是非常的重要的。买家秀特别好看的话&#xff0c;对于提升商品的销量来说&#xff0c;会有一定的帮助&#xff0c;如何下载别人的买家秀图片&#xff0c;然后用到自己的店铺中呢&#xff1f; 这里我可以教叫你们一个办法&#xff01;那…

pdf如何让多张图片在一页

pdf保存为一页六张图片的方法是&#xff1a; 1、打开pdf查看器,打开文档。 2、点击【打印】图标进入打印程序&#xff0c;选择打印范围。 3、在【打印处理】选项,选择【每张张上放置多页】。 4、自定义每页放置的图片张数为六张&#xff0c;并对打印排版预览设置。 5、设置打印…

Halcon (2):Halcon基础知识

文章目录 文章专栏视频资源前言Halcon文档案例学习结论 文章专栏 Halcon开发 视频资源 机器视觉之C#联合Halcon 前言 本章我们主要讲解Halcon的基础语法 Halcon文档 按下F1&#xff0c;就可以看到Halcon的文档&#xff0c;不过都是纯英文的 如果不清楚参数如何使用&#x…

土地利用强度(LUI)综合指数

土地利用强度的概念可以解释为某一时间特定区域内人类活动对土地利用强度的干扰程度[1]&#xff0c;其不仅反映不同土地利用类型本身的自然属性&#xff0c;也体现了人类利用土地的深度和广度&#xff0c;进而揭示在人类社会系统干扰下土地资源自然综合体自然平衡的保持状态[2]…

解决/usr/lib/libstdc++.so.6: version `GLIBCXX_3.x.x‘ not found问题

目录 1、查找缺少库版本2、动态库版本与gcc版本对应关系3、查找 libstdc.so.6.0.x 库文件4、如果libstdc.so.6.0.21库文件已存在&#xff0c;则按照下面的步骤创建软链接即可4.1 拷贝、软连接4.2验证新的 libstdc.so.6.0.21 库文件是否生效 5、如果libstdc.so.6.0.21库文件不存…

Codeforces Round 909 (Div. 3)(A~G)(启发式合并 , DSU ON TREE)

1899A - Game with Integers 题意&#xff1a;给定一个数 , 两个人玩游戏&#xff0c;每人能够执行 操作&#xff0c;若操作完是3的倍数则获胜&#xff0c;问先手的人能否获胜&#xff08;若无限循环则先手的人输&#xff09;。 思路&#xff1a;假如一个数模3余1或者2&#…

计算机msvcr120.dll丢失的解决方法,分享多种亲测可靠的方法

在使用计算机的过程中&#xff0c;我们有时可能会遇到一些技术问题&#xff0c;其中之一就是提示丢失msvcr120.dll文件。当计算机提示丢失msvcr120.dll文件时&#xff0c;可能是由于某些程序无法找到这个文件&#xff0c;从而导致程序无法正常运行。那么我们需要如何解决修复好…

微服务下整合knife4j接口文档

前言:本文旨在解决微服务下通过网关访问所用服务的knife4j文档&#xff0c;无需再通过其他服务单独访问 功能模块配置&#xff1a; 1.配置类&#xff1a; 在这个文件中注意下basePackage的扫描路径&#xff0c;修改为对应controller下的路径。 Configuration EnableSwagger…

教你轻松解决win系统ucrtbased.dll丢失的问题,亲测有效!

ucrtbased.dll是一个动态链接库文件&#xff08;DLL&#xff09;&#xff0c;它是Windows操作系统中的一部分&#xff0c;主要负责提供操作系统和应用程序所需的函数和接口。这个文件包含了操作系统和应用程序共同使用的通用代码&#xff0c;以确保不同程序之间的兼容性和稳定性…

人工智能发展前景

随着人工智能的快速发展&#xff0c;这个行业对人才的需求也在不断增长。越来越多的有志之士开始关注人工智能&#xff0c;希望通过自学获得相关技能&#xff0c;进而在人工智能领域找到心仪的职业。本文将探讨人工智能职业发展的前景&#xff0c;并为大家提供自学人工智能的途…

cesium雷达扫描(雷达扫描线)

cesium雷达扫描(雷达扫描线) 下面富有源码 实现思路 使用ellipse方法加载圆型,修改ellipse中‘material’方法重写glsl来实现当前效果 示例代码 index.html <!DOCTYPE html> <html lang="en"><head>

Golang环境搭建Win10(简洁版)

Golang环境搭建Win10 Golang环境搭建(Win10)一、前言二、Golang下载三、配置环境变量3.1、配置GOROOT3.2、配置GOPATH3.3、配置GOPROXY代理 Golang环境搭建(Win10) 一、前言 Go&#xff08;又称 Golang&#xff09;是 Google 的 Robert Griesemer&#xff0c;Rob Pike 及 Ken…

亚马逊云Amazon OpenSearch Serverless“利刃在手,‘向量’八方“

全Serverless架构新价值 随着Amazon OpenSearch Serverless正式上线“商用”&#xff0c;亚马逊云科技的全栈“Serverless”应用架构也“初见雏形”&#xff0c;这也意味着&#xff0c;未来企业可以在亚马逊云科技之上简单和轻松的搭建完整的无服务器应用架构。 数据也显示&am…

十二、Docker的简介

目录 一、介绍 Docker 主要由以下三个部分组成&#xff1a; Docker 有许多优点&#xff0c;包括&#xff1a; 二、Docker和虚拟机的差异 三、镜像和容器 四、Docker Hub 五、Docker架构 六、总结 一、介绍 Docker 是一种开源的应用容器平台&#xff0c;可以在容器内部…