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

[Java基础] Lambda 表达式

往期回顾

[Java基础] 基本数据类型

[Java基础] 运算符

[Java基础] 流程控制

[Java基础] 面向对象编程

[Java基础] 集合框架

[Java基础] 输入输出流

[Java基础] 异常处理机制

[Java基础] Lambda 表达式

目录

概述

Lambda 表达式的基本语法

应用场景

并发编程

集合操作

事件处理

排序

函数式接口

数据处理

自定义函数式接口

总结

概述

Java 8 引入了 Lambda 表达式,这是一种简化代码、提高可读性和表达力的新特性。Lambda 表达式允许你以函数的形式传递代码块,从而实现函数式编程的一些概念。下面是对 Lambda 表达式的详细介绍以及一些实战案例。

Lambda 表达式的基本语法

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

(parameters) -> expression

或者

(parameters) -> { statements; }

组件说明

  • 参数列表:可以有零个或多个参数,参数类型可以省略(编译器会根据上下文推断类型)。
  • 箭头-> 将参数列表与主体部分分开。
  • 主体:可以是一个表达式或一个代码块。如果主体是一个表达式,则不需要使用大括号;如果是代码块,则需要使用大括号 {} 包围。

应用场景

Java Lambda 表达式在多种场景下都非常有用,可以显著提高代码的简洁性和可读性。以下是 Lambda 表达式的一些常见应用场景:

并发编程

在多线程编程中,Lambda 表达式可以简化 RunnableCallable 的实现。

示例:使用 Lambda 表达式创建线程

public class LambdaRunnableExample {public static void main(String[] args) {// 传统方式new Thread(new Runnable() {@Overridepublic void run() {System.out.println("传统方式运行线程");}}).start();// 使用 Lambda 表达式new Thread(() -> {System.out.println("使用 Lambda 表达式运行线程");}).start();}
}

集合操作

Lambda 表达式与 Stream API 结合使用,可以高效地处理集合数据。

示例:使用 Stream API 过滤和转换列表

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class StreamExample {public static void main(String[] args) {List<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");names.add("Charlie");names.add("David");// 使用 Stream API 过滤并转换列表List<String> upperCaseNames = names.stream().filter(name -> name.length() > 3).map(String::toUpperCase).collect(Collectors.toList());System.out.println("过滤并转换后的列表: " + upperCaseNames);  // 输出: [ALICE, CHARLIE, DAVID]}
}

事件处理

在图形用户界面(GUI)编程中,Lambda 表达式可以简化事件处理器的实现。

示例:使用 Lambda 表达式处理按钮点击事件

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class LambdaEventExample {public static void main(String[] args) {JFrame frame = new JFrame("Lambda Event Example");JButton button = new JButton("Click me");// 传统方式button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("传统方式处理点击事件");}});// 使用 Lambda 表达式button.addActionListener(e -> System.out.println("使用 Lambda 表达式处理点击事件"));frame.add(button);frame.setSize(300, 200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}
}

排序

Lambda 表达式可以简化 Comparator 的实现,用于对集合进行排序。

示例:使用 Lambda 表达式实现 Comparator

import java.util.Arrays;
import java.util.List;public class LambdaComparatorExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 传统方式names.sort(new java.util.Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.compareTo(s2);}});System.out.println("传统方式排序: " + names);// 使用 Lambda 表达式names.sort((s1, s2) -> s1.compareTo(s2));System.out.println("使用 Lambda 表达式排序: " + names);}
}

函数式接口

Lambda 表达式可以实现函数式接口,如 FunctionPredicateConsumerSupplier 等。

示例:使用 Lambda 表达式实现 Function

import java.util.function.Function;public class LambdaFunctionExample {public static void main(String[] args) {// 定义一个 Function,将字符串转换为大写Function<String, String> toUpperCase = s -> s.toUpperCase();// 使用 FunctionString result = toUpperCase.apply("hello world");System.out.println(result);  // 输出: HELLO WORLD}
}

数据处理

Lambda 表达式可以用于数据处理任务,如过滤、映射和归约操作。

示例:使用 Stream API 进行数据处理

import java.util.Arrays;
import java.util.List;
import java.util.Optional;public class DataProcessingExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 找到第一个偶数Optional<Integer> firstEven = numbers.stream().filter(n -> n % 2 == 0).findFirst();firstEven.ifPresent(System.out::println);  // 输出: 2// 计算所有偶数的平方和int sumOfSquares = numbers.stream().filter(n -> n % 2 == 0).map(n -> n * n).reduce(0, Integer::sum);System.out.println("偶数的平方和: " + sumOfSquares);  // 输出: 220}
}

自定义函数式接口

你可以定义自己的函数式接口,并使用 Lambda 表达式实现它们。

示例:自定义函数式接口

@FunctionalInterface
interface MyFunction {int apply(int x, int y);
}public class CustomFunctionExample {public static void main(String[] args) {// 定义一个 Lambda 表达式MyFunction add = (x, y) -> x + y;// 使用 Lambda 表达式int result = add.apply(5, 3);System.out.println("5 + 3 = " + result);  // 输出: 5 + 3 = 8}
}

总结

Lambda 表达式在多种场景下都非常有用,可以简化代码、提高可读性和表达力。通过上述示例,你可以看到 Lambda 表达式在并发编程、集合操作、事件处理、排序、函数式接口、数据处理和自定义函数式接口等场景中的应用。希望这些示例能帮助你更好地理解和使用 Lambda 表达式。

相关文章:

[Java基础] Lambda 表达式

往期回顾 [Java基础] 基本数据类型 [Java基础] 运算符 [Java基础] 流程控制 [Java基础] 面向对象编程 [Java基础] 集合框架 [Java基础] 输入输出流 [Java基础] 异常处理机制 [Java基础] Lambda 表达式 目录 概述 Lambda 表达式的基本语法 应用场景 并发编程 集合…...

《深入掌握高德地图 API:全面调用指南与最佳实践》

本文 高德地图 API 调用指南引言高德 API 的基础设置注册和获取 API Key 基本 API 调用结构地理编码与逆地理编码地理编码&#xff08;Geocoding&#xff09;逆地理编码&#xff08;Reverse Geocoding&#xff09;注意事项 路径规划&#xff08;Direction API&#xff09;驾车路…...

【功能安全】系统架构设计

目录 01 系统架构介绍 02 投票逻辑架构介绍 03 SIS架构 04 ADS域控制器架构设计 01 系统架构介绍 法规GBT 34590 Part4 part10定义的软件要求、设计和测试子阶段之间的关系&#xff08;其中的3-7个人建议翻译为初始架构设计更合理 &#xff09; 系统架构的作用&#xf…...

FPGA实现PCIE视频采集转USB3.0输出,基于XDMA+FT601架构,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的PCIE方案本博已有的USB通信方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存FT601功能和硬件电路FT601读时序解读FT601写时序解读U…...

基于docker-compose编排部署微服务快速开发框架

1. 规划节点 节点规划&#xff0c;见表1。 表1 节点规划 IP主机名节点10.24.2.10masterdocker-compose节点 2. 基础准备 Docker和Docker Compose已安装完成&#xff0c;将提供的软件包Pig.tar.gz上传至master节点/root目录下并解压。 案例实施 1. 基础环境准备 &#x…...

【Java面试——并发编程——相关类和关键字——Day6】

1. Future 1.1 Future类 Future 类是异步思想的典型运用&#xff0c;主要用在一些需要执行耗时任务的场景&#xff0c;避免程序一直原地等待耗时任务执行完成&#xff0c;执行效率太低。具体来说是这样的&#xff1a;当我们执行某一耗时的任务时&#xff0c;可以将这个耗时任…...

Android 两种方式实现类似水波扩散效果

两种方式实现类似水波扩散效果&#xff0c;&#xff08;相比较而言&#xff0c;自定义view的效果更好点&#xff0c;动画实现起来更方便点。&#xff09; 自定义view实现动画实现 自定义view实现 思路分析&#xff1a;通过canvas画圆&#xff0c;每次改变圆半径和透明度&…...

基于SSM+小程序的垃圾分类管理系统(垃圾2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的垃圾分类管理系统实现了管理员及用户。 1、管理员功能结构图&#xff0c;管理员功能有个人中心&#xff0c;管理员管理&#xff0c;基础数据管理、论坛管理、垃圾信息管理…...

微服务网格Istio介绍

微服务网格Istio 介绍服务注册和发现服务度量灰度发布 Istio核心特性断路器互动1&#xff1a;举个生活中的例子解释断路器互动2&#xff1a;服务降级&#xff08;提高用户体验效果&#xff09; 超时重试多路由规则 Istio架构istio组件详解PilotEnvoyCitadelGalleyIngressgatewa…...

【MySQL】视图与用户管理——MySQL

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 视图 基本使用 视图规则和限制 用户管理 用户 用户信息 创建用户 删除用户 修改用户密码 数据库的权限 给用户授权 回收权限 视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&am…...

Go语言中三个输入函数(scanf,scan,scanln)的区别

Go语言中三个输入函数(scanf,scan,scanln)的区别 在 Go 语言中&#xff0c;fmt 包提供了三种输入函数&#xff1a;Scanf、Scan 和 Scanln。这三个函数都是用于从标准输入读取数据并存储到变量中&#xff0c;但是它们在处理输入的方式上有所不同。下面详细解读每个函数的特点和…...

uniapp使用html2canvas时,页面内的image元素模糊

不废话很简单只需要将image改成img就行 改之前 改之后 原因可能是因为uniapp里面的image标签做了某种处理...

华为交换机堆叠

堆叠方式 堆叠卡堆叠&#xff1a; 堆叠卡堆叠又可以分为两种情况&#xff1a; 交换机之间通过专用的堆叠插卡ES5D21VST000及专用的堆叠线缆连接。堆叠卡集成到交换机后面板上&#xff0c;交换机通过集成的堆叠端口及专用的堆叠线缆连接。 业务口堆叠&#xff1a; 业务口堆…...

Spring Boot框架下中小企业设备管理系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理中小企业设备管理系统的相关信息成为必然。…...

鸿蒙开发融云demo消息未读数

鸿蒙开发融云demo消息未读数 跟着我一步步搭建带界面的融云demo&#xff0c;这次是要显示未读数&#xff0c;未读数有两个&#xff0c;一个是消息列表的未读数&#xff0c;一个是主页消息tab上的未读数。 一、消息列表的未读数 先看下效果图&#xff1a; 关键代码如下&#…...

非对称加密算法(RSA):原理、应用与代码实现

一、引言 在当今数字化时代&#xff0c;信息安全成为了至关重要的议题。非对称加密算法作为保障信息安全的核心技术之一&#xff0c;在数据加密、数字签名、身份验证等领域发挥着不可或缺的作用。其中&#xff0c;RSA 算法以其可靠性、安全性和广泛的适用性&#xff0c;成为了…...

docker部署SQL审核平台Archery

1、概述 Archery 是一个开源的 SQL 审核平台,专为数据库的 SQL 运维和管理而设计,广泛应用于企业的数据库运维工作中。其主要功能是帮助数据库管理员和开发人员实现 SQL 审核、SQL 执行、在线执行、查询、工单管理、权限控制等数据库管理相关的操作。 Archery 的主要功能包括…...

ceph 删除rbd 锁的命令

文章目录 前言操作步骤 前言 记录一下ceph 删除rbd锁的命令 rbd lock rm poolname/uuid_disk "ID" Locker操作步骤 云主机实例的uuid是&#xff1a;fec52819-3b00-48e1-9f3b-c68c717bd619 # 获取rbd块的信息 rbd info nova/fec52819-3b00-48e1-9f3b-c68c717bd619…...

MySQL【知识改变命运】01

库的基本操作语法 1:SQL的简介2:SQL的基本分类3:库的基本操作1&#xff1a;查看库2&#xff1a;创建数据库1:创建一个diayang库2&#xff1a; ⾃定义⼀个数据库名&#xff0c;如果数据库不存则创建&#xff0c;3&#xff1a;查看警告信息4&#xff1a;字符集编码和校验(排序)规…...

苍穹外卖 Maven依赖配置

苍穹外卖所用到的Maven坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…...

从2012年ACE奖看电子产业创新:Zynq、CMOS振荡器与混合域示波器的启示

1. 从一场颁奖礼&#xff0c;看电子产业的创新脉搏前几天翻看资料库&#xff0c;又看到了2012年那场UBM ACE颁奖典礼的旧闻。说实话&#xff0c;每次回顾这种历史性的行业奖项&#xff0c;感觉都像在翻阅一本电子产业的“创新年鉴”。那一年&#xff0c;Xilinx的Zynq-7000、NXP…...

基于MCP协议的Shopify数据AI分析:自动化广告优化实战指南

1. 项目概述&#xff1a;用AI打通Shopify数据与广告投放的任督二脉 如果你在运营一个Shopify独立站&#xff0c;并且正在为Google、Meta&#xff08;Facebook/Instagram&#xff09;或TikTok广告投放而头疼&#xff0c;那么你很可能正经历着所有电商卖家的共同困境&#xff1a;…...

3分钟学会Xbox Game Pass存档提取:免费工具实现跨平台游戏进度迁移

3分钟学会Xbox Game Pass存档提取&#xff1a;免费工具实现跨平台游戏进度迁移 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor 作为游戏…...

CC2530项目实战:用OLED屏做个简易温湿度显示器(基于DHT11传感器)

CC2530实战&#xff1a;基于DHT11的OLED温湿度监测系统开发指南 在嵌入式开发领域&#xff0c;将传感器数据可视化是物联网项目的核心技能之一。CC2530作为一款经典的51内核单片机&#xff0c;搭配0.96寸OLED屏幕和DHT11温湿度传感器&#xff0c;可以构建一个低成本但功能完整的…...

RedwoodJS执行器:命令执行与进程管理的终极指南

RedwoodJS执行器&#xff1a;命令执行与进程管理的终极指南 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood RedwoodJS是一个功能强大的全栈JavaScript框架&#xff0c;它提供了一套完整的工具链来简化现代web应用的开发…...

Blender 3MF插件终极指南:从设计到3D打印的完整工作流解决方案

Blender 3MF插件终极指南&#xff1a;从设计到3D打印的完整工作流解决方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾因3D打印文件格式转换而头疼&#xff…...

图解人工智能(8)图灵测试作为智能与否的标准

有人不同意将图灵测试作为智能与否的标准。他们认为&#xff0c;就算机器表现得和人一样&#xff0c;也不能说机器拥有了智能&#xff0c;因为它只是一堆电路&#xff0c;和人的思维方式完全不同。你是否赞同这种说法&#xff1f;说说你赞同或反对的理由。开放讨论题。有几种观…...

003-VXLAN集中式网关实验(命令详解版)

VXLAN集中式网关实验1&#xff08;命令详解版&#xff09;最近有读者私信说刚开始学习VXLAN&#xff0c;实战技巧薄弱、部分命令不是很理解&#xff0c;想循序渐进通过实验过渡到真实项目案例。下面从一个简单的集中式网关实验开始&#xff0c;通过2个基础实验和1个项目实验完成…...

在vSphere ESXi 7.0上跑MacOS Big Sur?这份保姆级避坑指南帮你一次搞定

在vSphere ESXi 7.0上部署macOS Big Sur的深度避坑指南 虚拟化环境中运行macOS一直是技术爱好者和企业开发者的热门需求。本文将深入探讨在vSphere ESXi 7.0平台上安装macOS Big Sur时可能遇到的各种技术难题及其解决方案&#xff0c;帮助您避开那些让大多数用户头疼的"坑…...

别再只搜WOL教程了!华硕/微星主板BIOS里这两个隐藏选项没开,魔术包收到也白搭

华硕/微星主板WOL终极配置指南&#xff1a;破解BIOS隐藏选项的实战手册 深夜加班后想远程唤醒家里的台式机渲染视频&#xff0c;却发现魔术包石沉大海&#xff1f;你可能已经按照无数教程配置了网卡唤醒选项&#xff0c;却忽略了主板BIOS里那两个致命的隐藏开关。本文将用实验室…...