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

news2024/12/23 4:36:01

阅读建议

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

  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表达式实际上是一种语法糖衣,它使得函数式编程更加易于理解,但在某些情况下可能会掩盖代码的真实意图。这可能会导致代码的可维护性和可读性降低。

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

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

相关文章

RIP路由信息协议

RIP路由信息协议(Routing Information Protocol) 最先得到广泛应用的协议&#xff0c;最大优点是简单要求网络中的每个路由器都要维护一张表&#xff0c;表中记录了从它自己到其他每一个目的网络的距离RIP是应用层协议&#xff0c;它在传输层使用UDP&#xff0c;RIP报文作为UD…

Git 简介及使用

前言 假设有这样一个场景&#xff0c;老板让员工做一个档案&#xff0c;员工这个档案做好了之后交给老板看&#xff0c;此时老板不满意&#xff0c;又让回去改&#xff0c;改完给老板看&#xff0c;但是老板又不是很满意&#xff0c;就这样改了又改&#xff0c;给老板看过之后&…

WPF中行为与触发器的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 一、行为 (Behaviors) behaviors的简单测试 <Window x:Class"Test_05.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

YOLOv8改进 | DAttention (DAT)注意力机制实现极限涨点

论文地址&#xff1a; DAT论文地址 官方地址&#xff1a;官方代码的地址 代码地址&#xff1a;文末有修改了官方代码BUG的代码块复制粘贴即可 一、本文介绍 本文给大家带来的是YOLOv8改进DAT(Vision Transformer with Deformable Attention)的教程&#xff0c;其发布于2022…

java.net.UnknownHostException: eureka

java.net.UnknownHostException: eureka 哦。HOST漏了 #linux /etc/hosts #windows C:\Windows\System32\drivers\etc\hosts 127.0.0.1 eureka7000 127.0.0.1 eureka7001 127.0.0.1 eureka7002

Echarts柱状图配置代码详解,含常用图例代码

一、初识柱状图 从echarts官网引入基础的柱状图后&#xff0c;可以看到他有如下的配置项。我们可以改变各个配置项的属性&#xff0c;将图例调整为我们期望的效果。 二、常用配置项 因为引入echarts图例后&#xff0c;改变图例的东西都在option配置项中&#xff0c;所以其他部…

腾讯云轻量级服务器和云服务器什么区别?轻量服务器是干什么用的

随着互联网的迅速发展&#xff0c;服务器成为了许多人必备的工具。然而&#xff0c;面对众多的服务器选择&#xff0c;我们常常会陷入纠结之中。在这篇文章中&#xff0c;我们将探讨轻量服务器和标准云服务器的区别&#xff0c;帮助您选择最适合自己需求的服务器。 腾讯云双十…

python中sklearn库在数据预处理中的详细用法,及5个常用的Scikit-learn(通常简称为 sklearn)程序代码示例

文章目录 前言1. 数据清洗&#xff1a;使用 sklearn.preprocessing 中的 StandardScaler 和 MinMaxScaler 进行数据规范化。2. 缺失值处理&#xff1a;使用 sklearn.impute 中的 SimpleImputer 来填充缺失值。3. 数据编码&#xff1a;使用 sklearn.preprocessing 中的 OneHotEn…

python中的NumPy和Pandas往往都是同时使用,NumPy和Pandas的在数据分析中的联合使用

文章目录 前言一、numpy的介绍与用法二、pandas的介绍与用法三、numpy与pandas的联合使用说明四、numpy与pandas的联合使用程序代码4.1 读取CSV文件并进行数据清洗&#xff0c;如去除NaN值4.2 矩阵操作和特征工程&#xff0c;如标准化处理4.3 使用Pandas进行数据筛选和分组聚合…

ogrinfo不是内部或者外部命令

这个是GDAL的问题&#xff0c;我是通过OSGeo4w安装的&#xff0c;出来就是这个问题&#xff0c;教程没有仔细看干。 第一次安装&#xff0c;选择express install&#xff01;&#xff01;&#xff01;&#xff01; 第一次安装&#xff0c;选择express install&#xff01;&…

代码随想录算法训练营第三十九天【动态规划part02】 | 62.不同路径、63. 不同路径 II

62.不同路径 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 动规五部曲 确定dp数组及其下标含义&#xff1a;dp[i][j] 表示从&#xff08;0,0&#xff09;出发&#xff0c;到&#xff08;i,j&#x…

【算法】最短路径——弗洛伊德 (Floyd) 算法

目录 1.概述2.代码实现3.扩展3.应用 1.概述 &#xff08;1&#xff09;弗洛伊德 (Floyd) 算法又称为插点法&#xff0c;是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法&#xff0c;与 Dijkstra 算法类似。该算法名称以创始人之一、1978 年图灵奖获得者、…

Matalab插值详解和源码

转载&#xff1a;Matalab插值详解和源码 - 知乎 (zhihu.com) 插值法 插值法又称“内插法”&#xff0c;是利用函数f (x)在某区间中已知的若干点的函数值&#xff0c;作出适当的特定函数&#xff0c;在区间的其他点上用这特定函数的值作为函数f (x)的近似值&#xff0c;这种方…

腾讯云服务器租用价格,腾讯云服务器价格流量怎么算?

首先&#xff0c;让我们来看看腾讯云服务器租用价格。根据您的需求不同&#xff0c;腾讯云提供了多种不同的配置选项&#xff0c;从轻量级应用服务器到高性能的GPU服务器&#xff0c;都可以满足您的需求。以下是一些常见的腾讯云服务器租用价格&#xff1a; 一、腾讯云服务器租…

VPN创建连接 提示错误 628: 在连接完成前,连接被远程计算机终止。

提示错误 628: 在连接完成前&#xff0c;连接被远程计算机终止。 需要把这个地址配置一下&#xff1a; VPN类型&#xff1a;点对点PPTP 数据加密&#xff1a;如果没有加密的话&#xff0c; 要把这个选一下。

Flask 接口

目录 前言 代码实现 简单接口实现 执行其它程序接口 携带参数访问接口 前言 有时候会想着开个一个接口来访问试试&#xff0c;这里就给出一个基础接口代码示例 代码实现 导入Flask模块&#xff0c;没安装Flask 模块需要进行 安装&#xff1a;pip install flask 使用镜…

LeetCode——字符串(Java)

字符串 简介[简单] 344. 反转字符串[简单] 541. 反转字符串 II[中等] 151. 反转字符串中的单词 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路&#xff0c;如果有错误&#xff0c;可以在评论区提醒一下。 [简单] 344. 反转字符串…

AIGC创作系统ChatGPT源码,AI绘画源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

课程设计(毕业设计)—基于机器学习(CNN+opencv+python)的车牌识别—(可远程调试)计算机专业课程设计(毕业设计)

基于机器学习(CNNopencvpython)的车牌识别 下载本文机器学习(CNNopencvpython)的车牌识别系统完整的代码和参考报告链接&#xff08;或者可以联系博主koukou(壹壹23七2五六98)&#xff0c;获取源码和报告&#xff09;https://download.csdn.net/download/shooter7/88548767此处…

操作系统·进程同步

进程同步&#xff1a;异步环境下的一组并发进程因直接制约而互相发送消息、互相合作、互相等待&#xff0c;使得各进程按照一定的速度执行的过程。 进程同步的主要任务是使并发执行的诸进程之间能有效地共享资源和相互合作&#xff0c;使执行的结果具有可再现性。 4.1 进程同…