当前位置: 首页 > news >正文

如何理解 Java 8 引入的 Lambda 表达式及其使用场景

Lambda表达式是Java 8引入的一项重要特性,它使得编写简洁、可读和高效的代码成为可能。Lambda表达式本质上是一种匿名函数,能够更简洁地表示可传递的代码块,用于简化函数式编程的实现。

一、Lambda表达式概述

1. 什么是Lambda表达式

Lambda表达式是一种匿名函数,表示一段可传递的代码块,能够接受参数并返回结果。它是一种函数式接口(Functional Interface)的实例。函数式接口是仅包含一个抽象方法的接口,例如RunnableCallableComparator等。

Lambda表达式的引入旨在简化匿名内部类的使用,特别是在集合和流操作中,使代码更加简洁和易读。

2. Lambda表达式的语法

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

(parameters) -> expression

(parameters) -> { statements; }

具体语法形式包括:

  • 无参数() -> System.out.println("Hello, World!");
  • 一个参数,无需括号x -> x * x
  • 多个参数(x, y) -> x + y
  • 带有参数类型(int x, int y) -> x + y
  • 多行语句(x, y) -> { int sum = x + y; return sum; }

3. Lambda表达式的类型推断

Java编译器能够根据上下文推断Lambda表达式的参数类型,因此在大多数情况下,可以省略参数类型。例如:

Comparator<String> comparator = (a, b) -> a.compareToIgnoreCase(b);

在上面的例子中,编译器知道Comparator的类型参数是String,因此可以推断出ab都是String类型。

二、使用Lambda表达式的场景

1. 替代匿名内部类

Lambda表达式最常见的用途之一是替代匿名内部类,使代码更加简洁。例如,在事件处理和线程创建中,可以使用Lambda表达式代替匿名内部类。

事件处理

Java 8之前的代码:

button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("Button clicked!");}
});

使用Lambda表达式:

button.addActionListener(e -> System.out.println("Button clicked!"));
线程创建

Java 8之前的代码:

new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Thread running");}
}).start();

使用Lambda表达式:

new Thread(() -> System.out.println("Thread running")).start();

2. 集合操作

Lambda表达式在集合操作中极为有用,特别是结合Java 8引入的Stream API,可以极大地简化代码并提高可读性。

过滤和映射

Java 8之前的代码:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = new ArrayList<>();
for (String s : strings) {if (!s.isEmpty()) {filtered.add(s);}
}

使用Lambda表达式和Stream API:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = strings.stream().filter(s -> !s.isEmpty()).collect(Collectors.toList());
排序

Java 8之前的代码:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {@Overridepublic int compare(String a, String b) {return a.compareTo(b);}
});

使用Lambda表达式:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
names.sort((a, b) -> a.compareTo(b));

3. 自定义函数式接口

除了使用已有的函数式接口,我们还可以自定义函数式接口,并使用Lambda表达式进行实现。

定义函数式接口
@FunctionalInterface
interface MyFunctionalInterface {void execute();
}

使用Lambda表达式实现接口

MyFunctionalInterface myFunction = () -> System.out.println("Executing...");
myFunction.execute();

三、Java 8中的其他相关特性

1. 内置函数式接口

Java 8引入了一些常用的函数式接口,位于java.util.function包中,包括:

  • Predicate<T>:接受一个参数,返回boolean。常用于条件判断。
  • Function<T, R>:接受一个参数,返回一个结果。常用于转换操作。
  • Consumer<T>:接受一个参数,无返回值。常用于执行操作。
  • Supplier<T>:无参数,返回一个结果。常用于提供对象。
  • BinaryOperator<T>:接受两个参数,返回一个结果。常用于二元运算。
示例
// Predicate
Predicate<String> isNotEmpty = s -> !s.isEmpty();
List<String> nonEmptyStrings = strings.stream().filter(isNotEmpty).collect(Collectors.toList());// Function
Function<String, Integer> toLength = String::length;
List<Integer> lengths = strings.stream().map(toLength).collect(Collectors.toList());// Consumer
Consumer<String> print = System.out::println;
strings.forEach(print);// Supplier
Supplier<String> stringSupplier = () -> "Hello";
String s = stringSupplier.get();// BinaryOperator
BinaryOperator<Integer> sum = Integer::sum;
int result = sum.apply(1, 2);

2. 方法引用

方法引用是一种更简洁的Lambda表达式写法,用于直接引用已有的方法。方法引用的语法有四种形式:

  • 静态方法引用ClassName::staticMethod
  • 实例方法引用instance::instanceMethod
  • 特定类型的任意对象的方法引用ClassName::instanceMethod
  • 构造器引用ClassName::new
示例
// 静态方法引用
Function<String, Integer> parseInt = Integer::parseInt;// 实例方法引用
String str = "Hello";
Supplier<String> stringSupplier = str::toUpperCase;// 特定类型的任意对象的方法引用
Function<String, String> toUpperCase = String::toUpperCase;// 构造器引用
Supplier<List<String>> listSupplier = ArrayList::new;

四、Lambda表达式的优势和局限

1. 优势

  • 简洁性:Lambda表达式大大简化了代码,使代码更加简洁和易读。
  • 函数式编程:Lambda表达式支持函数式编程,使得Java能够更好地处理集合操作和并行流处理。
  • 代码重用:通过使用Lambda表达式和方法引用,可以更容易地实现代码重用。

2. 局限

  • 调试困难:由于Lambda表达式是匿名的,调试和排查问题可能比传统方法更困难。
  • 学习曲线:对于没有函数式编程背景的开发者,理解和使用Lambda表达式可能需要一些时间。
  • 性能开销:虽然Lambda表达式的性能一般较好,但在某些情况下,可能会引入额外的开销,如创建大量短命对象。

五、实战示例

以下是一个完整的示例,展示如何使用Lambda表达式和Stream API处理集合数据。

示例背景

假设我们有一个员工列表,我们需要进行以下操作:

  1. 过滤出年龄大于30的员工。
  2. 提取员工的名字。
  3. 对名字进行排序。
  4. 将名字转换为大写。
  5. 打印结果。

代码实现

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;class Employee {private String name;private int age;public Employee(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Employee{name='" + name + "', age=" + age + '}';}
}public class LambdaExample {public static void main(String[] args) {List<Employee> employees = Arrays.asList(new Employee("John", 25),new Employee("Jane", 35),new Employee("Jack", 40),new Employee("Jill", 22));List<String> result = employees.stream().filter(e -> e.getAge() > 30).map(Employee::getName).sorted().map(String::toUpperCase).collect(Collectors.toList());result.forEach(System.out::println);}
}

输出结果

JACK
JANE

通过这个示例,我们可以看到Lambda表达式和Stream API如何简化集合数据的处理,并使代码更加简洁和易读。

Lambda表达式是Java 8引入的一个重要特性,极大地增强了Java的表达能力和简洁性。通过Lambda表达式,开发者可以更方便地编写函数式代码,简化集合操作,提升代码的可读性和可维护性。

结合Stream API和方法引用,Lambda表达式使得Java能够更好地应对现代编程需求。尽管Lambda表达式也有其局限性,但它在提升开发效率和代码质量方面的优势是显而易见的。掌握和熟练运用Lambda表达式,对于现代Java开发者来说是必不可少的技能。

黑马程序员免费预约咨询

相关文章:

如何理解 Java 8 引入的 Lambda 表达式及其使用场景

Lambda表达式是Java 8引入的一项重要特性&#xff0c;它使得编写简洁、可读和高效的代码成为可能。Lambda表达式本质上是一种匿名函数&#xff0c;能够更简洁地表示可传递的代码块&#xff0c;用于简化函数式编程的实现。 一、Lambda表达式概述 1. 什么是Lambda表达式 Lambd…...

GPT-4与GPT-4O的区别详解:面向小白用户

1. 模型介绍 在人工智能的语言模型领域&#xff0c;OpenAI的GPT-4和GPT-4O是最新的成员。这两个模型虽然来源于相同的基础技术&#xff0c;但在功能和应用上有着明显的区别。 GPT-4&#xff1a;这是一个通用型语言模型&#xff0c;可以理解和生成自然语言。无论是写作、对话还…...

使用throttle防止按钮多次点击

背景&#xff1a;如上图所示&#xff0c;点击按钮&#xff0c;防止按钮点击多次 <div class"footer"><el-button type"primary" click"submitThrottle">发起咨询 </el-button> </div>import { throttle } from loda…...

Echarts 在折线图的指定位置绘制一个图标展示

文章目录 需求分析需求 在线段交汇处用一个六边形图标展示 分析 可以使用 markPoint 和 symbol 属性来实现。这是一个更简单和更标准的方法来添加标记点在运行下述代码后,你将在浏览器中看到一个折线图,其中在 [3, 35] (即图表中第四个数据点 Thu 的 y 值为 35 的位置)处…...

适用于 Windows 的 8 大数据恢复软件

数据恢复软件可帮助您恢复因意外删除或由于某些技术故障&#xff08;如硬盘损坏等&#xff09;而丢失的数据。这些工具可帮助您从硬盘驱动器 (HDD) 中高效地恢复丢失的数据&#xff0c;因为这些工具不支持从 SSD 恢复数据。重要的是要了解&#xff0c;您删除的数据不会被系统永…...

HTTP基础

一、HTTP协议 1、HTTP协议概念 HTTP的全称是&#xff1a;Hyper Text Transfer Protocol&#xff0c;意为 超文本传输协议。它指的是服务器和客户端之间交互必须遵循的一问一答的规则。形容这个规则&#xff1a;问答机制、握手机制。 它规范了请求和响应内容的类型和格式, 是基于…...

深入了解Linux命令:visudo

深入了解Linux命令&#xff1a;visudo 在Linux系统中&#xff0c;sudo&#xff08;superuser do&#xff09;是一个允许用户以其他用户身份&#xff08;通常是超级用户或其他用户&#xff09;执行命令的程序。sudo的配置文件/etc/sudoers存储了哪些用户可以执行哪些命令的权限…...

十大排序 —— 希尔排序

十大排序 —— 希尔排序 什么是希尔排序插入排序希尔排序递归版本 我们今天来看另一个很有名的排序——希尔排序 什么是希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种更高效的改进版本&#xff0c;由Donald Shell于1959年提出。它通过比较相距一定间…...

SpringCloud Hystrix服务熔断实例总结

SpringCloud Hystrix断路器-服务熔断与降级和HystrixDashboard SpringCloud Hystrix服务降级实例总结 本文采用版本为Hoxton.SR1系列&#xff0c;SpringBoot为2.2.2.RELEASE <dependency><groupId>org.springframework.cloud</groupId><artifactId>s…...

为什么没有输出九九乘法表?

下面的程序本来想输出九九乘法表到屏幕上&#xff0c;为什么没有输出呢&#xff1f;怎样修改&#xff1f; <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>我的HTML练习</title> …...

EasyRecovery5步轻松恢复电脑手机数据,EasyRecovery带你探索!

在当今的数字化时代&#xff0c;数据已经成为我们生活和工作中不可或缺的一部分。无论是个人照片、工作文件还是重要的商业信息&#xff0c;数据的安全存储和恢复都显得尤为重要。EasyRecovery作为一款广受欢迎的数据恢复软件&#xff0c;为用户提供了强大的数据恢复功能&#…...

904. 水果成篮

904. 水果成篮 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_904水果成篮_滑动窗口 错误经验吸取 原题链接&#xff1a; 904. 水果成篮 https://leetcode.cn/problems/fruit-into-baskets/description/ 完成情况&#xff1a; 解题思…...

在618集中上新,蕉下、VVC们为何押注拼多多?

编辑&#xff5c;Ray 自前两年崛起的防晒产品&#xff0c;今年依旧热度不减。 头部品牌蕉下&#xff0c;2020年入驻拼多多&#xff0c;如今年销售额已过亿元。而自去年起重点押注拼多多的时尚防晒品牌VVC&#xff0c;很快销量翻番。这两家公司&#xff0c;不约而同在618之前上…...

Maximo Attachments配置

以下内容以 Windows 上 Maximo 为例&#xff0c;并假定设置 DOCLINKS 的根路径为 “C:\DOCLINKS”。 HTTP Server配置 修改C:\Program Files\IBM\HTTPServer\conf\httpd.conf文件 查找 “DocumentRoot” 并修改成如下配置 DocumentRoot "C:\DOCLINKS"查找 “<…...

一分钟了解香港的场外期权报价

香港的场外期权报价 在香港这个国际金融中心&#xff0c;场外期权交易是金融市场不可或缺的一部分。场外期权&#xff0c;作为一种非标准化的金融衍生品&#xff0c;为投资者提供了在特定时间以约定价格买入或卖出某种资产的机会。对于希望参与这一市场的投资者来说&#xff0…...

专业开放式耳机什么牌子更好?六大技巧教你不踩坑!

相信很多入坑的朋友再最开始挑选耳机的时候都会矛盾&#xff0c;现在市面上这么多耳机&#xff0c;我该怎么选择&#xff1f;其实对于开放式耳机&#xff0c;大家都没有一个明确的概念&#xff0c;可能会为了音质的一小点提升而耗费大量的资金&#xff0c;毕竟这是一个无底洞。…...

注意!!24软考系统集成有变化,第三版考试一定要看这个!

系统集成在今年年初改版之后&#xff0c;上半年的考试也取消了&#xff0c;留给大家充足的时间来学习新的教材和考纲。但11月也将是第三版考纲的第1次考试&#xff0c;重点到底有什么&#xff1f;今天带大家详细的了解一下最新版中项考试大纲。 一、考试说明 1.考试目标 通过…...

Redis数据结构HyperLogLog以及布隆过滤器

HyperLogLog 引言 在开始之前&#xff0c;先思考一个常见的业务问题&#xff1a;如果负责开发维护一个大型的网站&#xff0c;有一天老板找产品经理要网站每个网页每天的UV数据&#xff0c;然后来开发这个统计模块&#xff0c;需要如何实现&#xff1f; 如果统计PV非常好办&…...

C++——从C语言快速入门

目录 一、数组 1、声明数组 2、初始化数组 3、访问数组元素 4、示例 5、注意事项 6、数组小练习 计算器支持加减乘除 数组找最大值 二、指针 三、字符串 string 类型 一、数组 在 C 中&#xff0c;数组是一种存储固定大小的相同类型元素的序列。数组的所有元素都存…...

thinkpad T440p ubuntu-slam软件安装记录

安装问题 1.ubuntu20.04安装后提示"x86/cpu:VMX(outside TXT) disabled by BIOS" 这是虚拟化被禁止了&#xff0c;到BIOS里去把Virtualization选项打开即可。 2.ACPI Error:Needed type[Reference],found [Integer] 等错误 link这篇博客中提到该问题&#xff0c;…...

本地电脑访问windows server系统服务器 并传输文件

1、 mstsc 命令打开远程桌面连接。 2、填入登入的用户密码&#xff0c;在本地资源中设置需要共享的盘。登入成功后就可以在服务器与本地电脑互传文件了。...

kubernetes负载均衡---MetalLB

https://github.com/metallb/metallb 参考 &#xff1a; https://mp.weixin.qq.com/s/MBOWfcTjFMmgJFWw-FIk0Q 自建的Kubernetes集群&#xff0c;默认情况下是不支持负载均衡的。当需要提供服务的外部访问时&#xff0c;可使用 Ingress、NodePort等方式。他们都存在一些问题 …...

Python面试宝典:Python中与设计模式相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十二章:代码设计和设计模式:第二节:设计模式】 第二十二章:代码设计和设计模式第二节:设计模式创建型模式结构型模式行为型模式python中与设计模式相关的面试笔试题面试题1面试题…...

以sqlilabs靶场为例,讲解SQL注入攻击原理【18-24关】

【less-18】 打开时&#xff0c;获取了自己的IP地址。&#xff0c;通过分析源码知道&#xff0c;会将用户的user-agent作为参数记录到数据库中。 提交的是信息有user-Agent、IP、uname信息。 此时可以借助Burp Suite 工具&#xff0c;修改user_agent&#xff0c;实现sql注入。…...

【已有项目版】uniapp项目发版pda -- Android Studio

必备资料清单&#xff1a; 构建完成的app项目 在HBuilderX开发的uniapp项目 .keystore文件 文章目录 1. 安装Android Studio&#xff1a;https://developer.android.google.cn/studio?hlzh-cn2. 安装Android 离线SDK&#xff1a;https://nativesupport.dcloud.net.cn/AppDocs…...

三维重建,谁才是顶流?

3DGS技术是近年来计算机视觉领域最具突破性的研究成果之一。它不仅在学术界引起了广泛关注&#xff0c;成为计算机视觉、SLAM等领域的研究热点&#xff0c;而且每天都有大量基于Gaussian Splatting的新研究问世。此外&#xff0c;3DGS技术在商业应用方面也取得了显著进展&#…...

s32k314【入门新手篇】-开发环境安装【ds32开发平台】

软件包下载 登录nxp官网下载&#xff1a;https://www.nxp.com/ 然后输入关键字&#xff1a;S32 查看 下载安装包 以上三步请先注册好并登录你的个人账号 下载完之后如下&#xff1a; 软件安装 eb安装并激活【试用版】 激活 2 安装ds 弹出什么就安装什么就好了。 …...

DiffBIR论文阅读笔记

这篇是董超老师通讯作者的一篇盲图像修复的论文&#xff0c;目前好像没看到发表在哪个会议期刊&#xff0c;应该是还在投&#xff0c;这个是arxiv版本&#xff0c;代码倒是开源了。本文所指的BIR并不是一个single模型对任何未知图像degradation都能处理&#xff0c;而是用同一个…...

基于STM32的位置速度环PID控制伺服电机转动位置及程序说明

PID控制原理 PID控制原理是一种广泛应用于工业自动化和其他领域的控制算法。PID控制器的名字来源于其三个主要组成部分&#xff1a;比例&#xff08;Proportional&#xff09;、积分&#xff08;Integral&#xff09;和微分&#xff08;Derivative&#xff09;。PID控制器实现…...

操作失败——后端

控制台观察&#xff0c;页面发送的保存菜品的请求 返回的response显示&#xff1a; ---------- 我开始查看明明感觉都挺正常&#xff0c;没啥错误&#xff0c;就是查不出来。结果后面电脑关机重启后&#xff0c;隔一天看&#xff0c;就突然可以了。我觉着可能是浏览器的缓存没…...

静态中英文网站怎么做/网站收录查询爱站

很早就玩了搜狐博客&#xff0c;但是就像其他的网络应用一样&#xff0c;时间久了就没了兴趣&#xff0c;原来的搜狐博客一直当日记&#xff0c;当回忆录写&#xff0c;写了一年多&#xff0c;后来发现写的私密的东西太多&#xff0c;就把权限全给封了&#xff0c;也不再写了&a…...

ppt中超链接网站怎么做/2022社会热点事件及看法

2011年年初&#xff0c;美国领英公司(LinkedIn)开源了一款基础架构软件&#xff0c;以奥地利作家弗兰兹卡夫卡(Franz Kafka)的名字命名&#xff0c;之后LinkedIn将其贡献给Apache基金会&#xff0c;随后该软件于2012年10月成功完成孵化并顺利晋升为Apache顶级项目——这便是大名…...

做app模板网站有哪些/免费做网站怎么做网站链接

当然可以!这是一个使用辗转相除法来求最大公约数的 Java 程序示例: public class GCD {public static void main(String[] args) {int a = 24;int b = 36;int gcd = findGCD(a, b);System.out.println("最大公约数是:" + gcd);}...

去国外做外卖网站/深圳百度推广优化

String 2015.01.14&15By 970655147这个类, 相信是java中用到的最多的一个类了吧, 任何地方都有他的踪迹, 比如你要打印数据到控制台, 或者从网页中抓取数据, 等等 java 中的恒常类之一 [恒常类&#xff1a;String、Integer、Boolean、Float、Double、Char、Byte], 这个类是…...

济南做网站哪里便宜/如何推广网店

** 关于快排函数的一些说明 ** qsort,包含在stdlib.h头文件里,函数一共四个参数,没返回值.一个典型的qsort的写法如下 qsort(s,n,sizeof(s[0]),cmp); 其中&#xff1a; 第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式,这个…...

佛山门户网站建设/网络推广方法有几种

循环中使用闭包&#xff0c;假设我们需要在每次循环中调用循环序号 for(var i 0; i < 10; i) {setTimeout(function() {console.log(i); }, 1000);}上面的代码不会输出数字 0 到 9&#xff0c;而是会输出数字 10 十次。 当 console.log 被调用的时候&#xff0c; 匿名函数保…...