【Java从入门到放弃 之 Stream API】
Java Stream API
- Stream API
- 行为参数化传递代码
- Lambda表达式
- Lambda 表达式的语法
- 方法引用
- Lambda 表达式的实际应用
- 集合操作
- 并发编程
- Lambda 表达式的注意事项
- 总结
Stream API
Java8提供了一个全新的API - Stream。引入这个Stream的主要目的,一个是可以支持更好的并发;一个是通过使用Stream可以向方法传递代码(更简洁的形式)
Collections.sort(list, new Comparator<Stu>() {@Overridepublic int compare(Stu o1, Stu o2) {return o1.score - o2.score;}});
之前如果我们想给函数传递代码,需要通过匿名类的形式,可以看见这种形式比较繁琐。使用Java8的写法如下
Collections.sort(list, (o1, o2) -> o1.score - o2.score);
是不是马上就简单了很多呢!
行为参数化传递代码
** 更好地传递代码 **
class Stu {private int age;private int score;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}
}
public static List<Stu> filterScoreBigThan60(List<Stu> list) {List<Stu> ret = new ArrayList<>();for (Stu stu : list) {if (stu.getScore() > 60) {ret.add(stu);}}return ret;}public static List<Stu> filterAgeMoreThan15(List<Stu> list) {List<Stu> ret = new ArrayList<>();for (Stu stu : list) {if (stu.getAge() > 15) {ret.add(stu);}}return ret;}
我们自定义了一个Stu类,下面写了两个静态方法,用来过滤Stu的。观察这两段静态方法的代码,你发现什么了吗?
没错,我们会发现,这两段代码高度地相同。如果我们现在要再写一个过滤超过80分地学生,难道要在把代码复制粘贴一边?这肯定不是很好的实现方式,因为相同代码过多,我们一旦粘贴复制,很有可能会出现忘改某一些地方的情况 如果你现实中做过开发,搞过这种类似需求的代码,你一定明白我说的是啥。复制代码,但是某一些关键要改的地方不小心给漏掉了。而且每一个条件都要新建一个函数,会非常繁琐,函数名也会变得越来越长。
ok,问题我们是知道了,怎么解决了?
- 使用策略模式解决
filterStuByInterface(list, new MyPredicate() {@Overridepublic boolean test(Stu stu) {return stu.getAge() > 60;}});public static List<Stu> filterStuByInterface(List<Stu> list, MyPredicate predicate) {List<Stu> ret = new ArrayList<>();for (Stu stu : list) {if (predicate.test(stu)) {ret.add(stu);}}return ret;}
我们把一组策略封装到一个策略里面,这里面使用的一个接口。所有的策略都实现这个接口。这样我们的方法就是通用的,每次使用的时候只要传入对应的策略就可以了。
- 使用Lambda表达式解决
public static List<Stu> filterSte(List<Stu> list, Predicate<Stu> predicate) {List<Stu> ret = new ArrayList<>();for (Stu stu : list) {if (predicate.test(stu)) {ret.add(stu);}}return ret;}
Predicate predicate这个是什么意思呢?Predicate是一个泛型接口,里面有一个test用来返回boolean值。
@FunctionalInterface
public interface Predicate<T> {boolean test(T t);
}
我们随便通过使用策略模式也可以解决问题,但是通过对比Lambda表达式,我们发现Lambda表达式表达地更加简洁易懂。
Lambda表达式
Lambda 表达式是 Java 8 引入的一项重要特性,它使得代码更加简洁和易读,尤其是在处理集合、并发编程等方面。Lambda 表达式允许你以更函数式的方式编写代码,而不需要显式地创建匿名内部类。
Lambda 表达式的语法
Lambda 表达式的语法非常简洁,通常包括三个部分:参数列表、箭头符号(->)、方法体。
(parameters) -> expression或(parameters) -> { statements; }
方法引用
方法引用是一种简化 Lambda 表达式的方式,当 Lambda 表达式只是调用一个已有的方法时,可以使用方法引用来代替 Lambda 表达式。方法引用有以下几种形式:
- 静态方法引用:ClassName::staticMethod
- 实例方法引用:instance::instanceMethod
- 特定类型的方法引用:Type::method
- 构造方法引用:ClassName::new
Lambda 表达式的实际应用
集合操作
Java 8 引入了流(Stream API),它可以与 Lambda 表达式一起使用,从而简化集合的操作,如过滤、映射、排序等。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 过滤出长度大于 5 的名字,并转换为大写List<String> filteredNames = names.stream().filter(name -> name.length() > 5).map(String::toUpperCase).collect(Collectors.toList());System.out.println(filteredNames); // 输出 [CHARLIE]
并发编程
ExecutorService executor = Executors.newFixedThreadPool(4);executor.submit(() -> {try {Thread.sleep(1000);System.out.println("Task completed by " + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();}});executor.shutdown();
Lambda 表达式的注意事项
- 访问外部变量:Lambda 表达式可以访问外部的局部变量,但这些变量必须是有效的最终变量(effectively final),即它们在初始化后不能被修改。
- 多线程安全:虽然 Lambda 表达式本身是线程安全的,但如果它操作共享资源,则需要考虑同步问题。
- 性能:Lambda 表达式通常比匿名内部类更高效,因为它们避免了额外的类加载和内存分配。
总结
Lambda 表达式是 Java 8 引入的一个强大特性,它使代码更加简洁、易读,并且促进了函数式编程风格的应用。通过 Lambda 表达式,你可以更方便地处理集合、并发编程等问题。希望这些介绍和示例能帮助你更好地理解和使用 Lambda 表达式。如果有任何具体问题或需要进一步的帮助,请随时提问!
相关文章:
【Java从入门到放弃 之 Stream API】
Java Stream API Stream API行为参数化传递代码Lambda表达式Lambda 表达式的语法方法引用 Lambda 表达式的实际应用集合操作并发编程 Lambda 表达式的注意事项总结 Stream API Java8提供了一个全新的API - Stream。引入这个Stream的主要目的,一个是可以支持更好的并…...
Ruby On Rails 笔记1——Rails 入门
突然想跟着官方文档把Ruby On Rails过一遍,把一些有用的记下来就可以一直看了,do它! https://guides.rubyonrails.org/v7.2/ 注:官网是英文文档,我自己翻译了一下,不确保完全准确,只供自己学习开发使用。 …...
高效开发 Python Web 应用:FastAPI 数据验证与响应体设计
高效开发 Python Web 应用:FastAPI 数据验证与响应体设计 目录 🧑💻 FastAPI 的数据验证系统与 Pydantic 模型📦 响应体与模型:定义响应数据的最佳实践🔄 响应模型与查询参数的结合:增强灵活…...
基于“开源 2+1 链动 O2O 商城小程序”的门店拉新策略与流程设计
摘要:在数字化商业浪潮席卷之下,实体门店面临着激烈的市场竞争,如何高效拉新成为关乎门店生存与发展的关键问题。本文聚焦于“开源 21 链动 O2O 商城小程序”,深入探讨结合多种手段的门店拉新策略及详细流程设计。通过剖析到店扫码…...
33.5 remote实战项目之设计prometheus数据源的结构
本节重点介绍 : 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write设计prometheus 数据源的结构初始化 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写…...
微服务springboot详细解析(一)
目录 1.Spring概述 2.什么是SpringBoot? 3.第一个SpringBoot程序 4.配置参数优先级 5.springboot自动装配原理 6.SpringBootApplication&SpringApplication.run 7.ConfigurationProperties(prefix "") 8.Validated数据校验 29、聊聊该如何写一…...
深入探讨Go语言中的双向链表
简介 双向链表是链表家族中的一种高级结构,每个节点不仅指向下一个节点,还指向上一个节点。今天,我们将学习如何在Go语言中实现和操作这种灵活的数据结构。 双向链表的优缺点 优点: 可以从任一方向遍历链表,灵活性高…...
Fastapi + vue3 自动化测试平台---移动端App自动化篇
概述 好久写文章了,专注于新框架,新UI界面的实践,废话不多说,开搞 技术架构 后端: Fastapi Airtest multiprocessing 前端: 基于 Vue3、Vite、TypeScript、Pinia、Pinia持久化插件、Unocss 和 Elemen…...
ElasticSearch easy-es 聚合函数 group by 混合写法求Top N 词云 分词
1.将用户访问记录表数据同步到ES,并且分词,获取用户访问最多前十条词语。 Elasticsearch、Easy-es 快速入门 SearchAfterPage分页 若依前后端分离 Ruoyi-Vue SpringBoot 使用结巴分词器 <!-- 分词器--><dependency><groupId>com.hua…...
在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录
介绍 日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中,集成 Serilog 作为记录请求和响应(包括传入和传出的数据)的中间件可以显著提高 Web API 的可观察性和故障排除能力。 在过去的几周里&…...
2024年顶级小型语言模型前15名
本文,我们将深入了解2024年备受瞩目的十五款小型语言模型(SLMs),它们分别是Llama 3.1 8B、Gemma2、Qwen 2、Mistral Nemo、Phi-3.5等。这些SLMs以其精巧的体积和高效率著称,它们不需要依赖庞大的服务器资源,…...
精通 Python 网络安全(一)
前言 最近,Python 开始受到越来越多的关注,最新的 Python 更新添加了许多可用于执行关键任务的包。我们的主要目标是帮助您利用 Python 包来检测和利用漏洞,并解决网络挑战。 本书将首先带您了解与网络和安全相关的 Python 脚本和库。然后&…...
【python自动化二】pytest集成allure生成测试报告
pytest本身不会直接生成测试报告,而allure是一种生成测试报告的公共插件,可与多种测试框架配合生成测试报告,本文介绍下如何集成allure生成测试报告。 1.allure安装 1.安装allure-pytest 先安装allure的pytest插件,用于在pytes…...
网络版本的通讯录青春版(protobuf)
环境搭建 Protobuf 还常⽤于通讯协议、服务端数据交换场景。 因为我们主要目的只是为了学习protobuf,因此对于客户端,原本应该具备: 新增⼀个联系⼈ ◦ 删除⼀个联系⼈ ◦ 查询通讯录列表 ◦ 查询⼀个联系⼈的详细信息 这样四个功能。 …...
开源模型应用落地-安全合规篇-用户输入价值观判断(三)
一、前言 在深度合规功能中,对用户输入内容的价值观判断具有重要意义。这一功能不仅仅是对信息合法性和合规性的简单审核,更是对信息背后隐含的伦理道德和社会责任的深刻洞察。通过对价值观的判断,系统能够识别可能引发不当影响或冲突的内容,从而为用户提供更安全、更和谐的…...
神经网络入门实战:(十四)pytorch 官网内置的 CIFAR10 数据集,及其网络模型
(一) pytorch 官网内置的网络模型 图像处理: Models and pre-trained weights — Torchvision 0.20 documentation (二) CIFAR10数据集的分类网络模型(仅前向传播): 下方的网络模型图片有误,已做修改,具…...
【Rust在WASM中实现pdf文件的生成】
Rust在WASM中实现pdf文件的生成 前言概念和依赖问题描述分步实现pdf转Blob生成URL两种方式利用localstorage传递参数处理图片Vec<u8>到pdf格式的Vec<u8>使用rust创建iframe显示pdf的Blob最后 前言 实现了一个通用的前端jpg转pdf的wasm,因为动态响应框架无法直接打…...
在MySQL中执行sum case when报错:SUM does not exist
1. 报错 在pgsql中能正常运行的一段SQL在MySQL中运行的时候报错了: SELECT DATE( hr.handle_time ) AS statsDate,SUM ( CASE WHEN hma.app_type IN ( 2, 5 ) THEN ch_money ELSE 0 END ) AS aliPayAmt,SUM ( CASE WHEN hma.app_type IN ( 1, 4 ) THEN ch_money EL…...
【openssl】相关指令
熟悉下相关概念 x509:证书标准pem和der:两种(包括公私钥、证书签名请求、证书等内容的)的格式,前者是文本形式,linux常用,后者是二进制形式,windows常用,仅仅是格式&…...
实例分割详解
实例分割详解 引言 实例分割是计算机视觉领域的一项复杂任务,它要求模型能够识别图像中不同类别的对象,并对每个单独的对象进行像素级别的分类。与语义分割不同的是,实例分割不仅要区分不同的类别,还要识别同一类别中的不同个体…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
