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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB画图分辨率、图像大小研究

MATLAB画图分辨率、图像大小研究 Figure属性中 InnerPosition Position OuterPosition区别画图与打印的分辨率和图像大小研究首先明确两个概念&#xff1a;MATLAB实操画图 Figure属性中 InnerPosition Position OuterPosition区别 在画图的时候&#xff0c;我们经常需要设置Fi…

迪杰斯特拉算法(C++)

目录 介绍&#xff1a; 代码&#xff1a; 结果&#xff1a; 介绍&#xff1a; 迪杰斯特拉算法&#xff08;Dijkstras algorithm&#xff09;是一种用于计算加权图的单点最短路径的算法。它是由荷兰计算机科学家Edsger W. Dijkstra在1956年发明的。 该算法的思路是&#xf…

合成事件在san.js中的应用

一、 什么是合成事件 DOM3 Event 新增了合成事件(CompositionEvent ), 用于处理通常使用 IME 输入时的复杂输入序列。 二、合成事件常见事件 compositionstart&#xff1a;文本合成系统如 IME&#xff08;即输入法编辑器&#xff09;开始新的输入合成时会触发 compositionst…

SUID提权教程

SUID提权方法 一、SUID是什么&#xff1f;二、如何设置SUID权限&#xff1f;三、已知的具有SUID权限的二进制可执行文件四、查找具有root权限的SUID的文件1.find命令提权2.nmap命令提权3.more命令提权4.less命令提权5.bash命令提权6.vim命令提权7.awk命令提权8.cp命令提权 五、…

springcloudalibaba-3

一、Nacos Config入门 1. 搭建nacos环境【使用现有的nacos环境即可】 使用之前的即可 2. 在微服务中引入nacos的依赖 <!-- nacos配置依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-…

【动态规划】求解编辑距离问题

目录 问题描述递推关系运行实例时空复杂度优化Hirschberg 算法 问题描述 编辑距离问题是求解将⼀个字符串转换为另⼀个字符串所需的插⼊、删除、替换的最小次数。 C O M M O M → s u b C O M M U M → s u b C O M M U N → i n s C O M M U N E \mathbb{COMMOM} \overset{sub…

HarmonyOS真机调试报错:INSTALL_PARSE_FAILED_USESDK_ERROR处理

1、 新建应用时选择与自己真机匹配的sdk版本 查看自己设备sdk版本 创建时先择匹配版本&#xff1a; 2、 根据报错提示连接打开处理方案 3、查询真机版本对应的compileSdkVersion 和 compatibleSdkVersion 提示3.1版本之后和3.1版本之前的不同命令&#xff08;此处为3.0版…

Scrum框架中的Sprint

上图就是sprint里要做的事。Sprint是scrum框架的核心&#xff0c;是所有的想法、主意转换为价值的地方。所有实现产品目标的必要工作都在sprint里完成&#xff0c;这些工作主要包括Sprint 计划&#xff08;Sprint planning&#xff09;、每日站会&#xff08;Daily Scrum&#…

异地工业设备集中运维、数据采集,一招搞定

为了提升运维效率&#xff0c;能够及时发现和响应设备的故障、异常和潜在问题。 越来越多的企业都在搭建“集中式”的远程智慧运维体系&#xff0c;以提高运维效率和降低成本。 异地工业设备远程运维&#xff0c;提升响应效率、降低运维成本 以国内陕西某机床公司为例&#xff…

vue+element实现多级表头加树结构

标题两种展示方式 方式一 完整代码: <template><div class"box"><el-tableref"areaPointTable":data"tableData"border:span-method"objectSpanMethod":header-cell-style"tableHeaderMerge"><el-ta…

【10套模拟】【6】

关键字&#xff1a; 有向图入度、无向图度、一次深度优先、快速排序平均性能、折半查找、判断是否是二叉排序树、链式直接入插入排序

现在的各类解释非常混乱,到底什么是智慧城市?

智慧城市&#xff0c;简单来说&#xff0c;就是运用先进的信息和通信技术&#xff0c;让城市管理更加智能、高效&#xff0c;让市民的生活更加便捷、舒适。 在我们日常生活中&#xff0c;智慧城市带来的改变无处不在。 想象一下&#xff0c;当你早上醒来&#xff0c;你的手机已…