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

JDK 8+新特性(Stream API、Optional、模块化等)

JDK 8+新特性(Stream API、Optional、模块化等)

一、Stream API

1.1 概述

Stream API 是 Java 8 引入的一个新的抽象概念,它允许以声明式的方式处理数据集合。Stream 不是一个数据结构,而是对数据源(如集合、数组等)进行一系列操作的管道。这些操作可以是中间操作(如过滤、映射)和终端操作(如收集、计数)。使用 Stream API 可以使代码更加简洁、易读,并且可以利用多核处理器的并行处理能力。

1.2 基本操作

中间操作
  • filter:用于过滤满足条件的元素。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamFilterExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());System.out.println(evenNumbers);}
}
  • map:用于将元素进行转换。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamMapExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3);List<Integer> squaredNumbers = numbers.stream().map(n -> n * n).collect(Collectors.toList());System.out.println(squaredNumbers);}
}
终端操作
  • collect:用于将流中的元素收集到一个集合中。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamCollectExample {public static void main(String[] args) {List<String> words = Arrays.asList("apple", "banana", "cherry");String result = words.stream().collect(Collectors.joining(", "));System.out.println(result);}
}
  • count:用于统计流中元素的数量。
import java.util.Arrays;
import java.util.List;public class StreamCountExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);long count = numbers.stream().filter(n -> n > 3).count();System.out.println(count);}
}

1.3 并行流

Stream API 支持并行流,可以利用多核处理器的并行处理能力来提高性能。使用 parallelStream() 方法可以将顺序流转换为并行流。

import java.util.Arrays;
import java.util.List;public class ParallelStreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);long sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();System.out.println(sum);}
}

二、Optional

2.1 概述

Optional 是 Java 8 引入的一个容器类,用于表示一个值可能存在或不存在的情况。它可以避免空指针异常(NullPointerException),使代码更加健壮。

2.2 基本用法

  • 创建 Optional 对象
    • Optional.of(T value):创建一个包含非空值的 Optional 对象。如果传入的值为 null,会抛出 NullPointerException
    • Optional.ofNullable(T value):创建一个可能包含 null 值的 Optional 对象。如果传入的值为 null,则返回一个空的 Optional 对象。
    • Optional.empty():创建一个空的 Optional 对象。
import java.util.Optional;public class OptionalCreationExample {public static void main(String[] args) {Optional<String> nonEmptyOptional = Optional.of("Hello");Optional<String> nullableOptional = Optional.ofNullable(null);Optional<String> emptyOptional = Optional.empty();}
}
  • 判断值是否存在
    • isPresent():判断 Optional 对象中是否包含值。
    • ifPresent(Consumer<? super T> action):如果 Optional 对象中包含值,则执行指定的操作。
import java.util.Optional;public class OptionalIsPresentExample {public static void main(String[] args) {Optional<String> optional = Optional.of("Hello");if (optional.isPresent()) {System.out.println(optional.get());}optional.ifPresent(s -> System.out.println(s.toUpperCase()));}
}
  • 获取值
    • get():如果 Optional 对象中包含值,则返回该值;否则抛出 NoSuchElementException
    • orElse(T other):如果 Optional 对象中包含值,则返回该值;否则返回指定的默认值。
    • orElseGet(Supplier<? extends T> other):如果 Optional 对象中包含值,则返回该值;否则通过调用指定的 Supplier 函数获取默认值。
import java.util.Optional;public class OptionalGetValueExample {public static void main(String[] args) {Optional<String> optional = Optional.ofNullable(null);String value = optional.orElse("Default");System.out.println(value);String value2 = optional.orElseGet(() -> "Generated Default");System.out.println(value2);}
}

三、模块化(Java 9+)

3.1 概述

Java 9 引入了模块化系统(Project Jigsaw),它允许将代码组织成模块,每个模块有自己的声明性依赖和访问控制。模块化可以提高代码的可维护性、安全性和可扩展性,并且可以减少类路径的复杂性。

3.2 模块定义

在 Java 9+ 中,每个模块由一个 module-info.java 文件来定义。该文件位于模块的根目录下,用于声明模块的名称、依赖关系和导出的包。

// module-info.java
module myModule {// 声明依赖的模块requires java.base;requires anotherModule;// 导出的包exports com.example.myPackage;
}

3.3 模块的优点

  • 封装性:模块可以控制哪些包对外可见,从而提高代码的封装性和安全性。
  • 可维护性:模块之间的依赖关系明确,便于代码的维护和升级。
  • 性能优化:模块化系统可以减少类加载的开销,提高应用程序的启动性能。

3.4 模块的使用

在编译和运行时,需要指定模块路径和主模块。例如:

# 编译模块
javac --module-path path/to/modules -d out module-info.java com/example/myPackage/MyClass.java# 运行模块
java --module-path path/to/modules -m myModule/com.example.myPackage.MyClass

四、其他 JDK 8+ 新特性

4.1 接口默认方法和静态方法

Java 8 允许在接口中定义默认方法和静态方法。默认方法使用 default 关键字修饰,为接口提供了默认的实现;静态方法使用 static 关键字修饰,可以直接通过接口名调用。

interface MyInterface {// 默认方法default void defaultMethod() {System.out.println("This is a default method.");}// 静态方法static void staticMethod() {System.out.println("This is a static method.");}
}

4.2 日期时间 API

Java 8 引入了新的日期时间 API(java.time 包),它提供了更简洁、线程安全的日期和时间处理方式。例如:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;public class DateTimeExample {public static void main(String[] args) {LocalDate currentDate = LocalDate.now();LocalTime currentTime = LocalTime.now();LocalDateTime currentDateTime = LocalDateTime.now();System.out.println("Current date: " + currentDate);System.out.println("Current time: " + currentTime);System.out.println("Current date and time: " + currentDateTime);}
}

4.3 方法引用

方法引用是 Lambda 表达式的一种简洁形式,它允许直接引用已有的方法。方法引用使用 :: 符号,常见的方法引用有:

  • 静态方法引用ClassName::staticMethodName
  • 实例方法引用instance::instanceMethodName
  • 构造方法引用ClassName::new
import java.util.Arrays;
import java.util.List;public class MethodReferenceExample {public static void main(String[] args) {List<String> words = Arrays.asList("apple", "banana", "cherry");words.forEach(System.out::println);}
}

相关文章:

JDK 8+新特性(Stream API、Optional、模块化等)

JDK 8新特性&#xff08;Stream API、Optional、模块化等&#xff09; 一、Stream API 1.1 概述 Stream API 是 Java 8 引入的一个新的抽象概念&#xff0c;它允许以声明式的方式处理数据集合。Stream 不是一个数据结构&#xff0c;而是对数据源&#xff08;如集合、数组等&…...

国产编辑器EverEdit - 独门暗器:自动监视剪贴板内容

1 监视剪贴板 1.1 应用场景 如果需要对剪贴板的所有历史进行记录&#xff0c;并进行分析和回顾&#xff0c;则可以使用监视剪贴板功能&#xff0c;不仅在EverEdit中的复制会记录&#xff0c;在其他应用的复制也会记录。 1.2 使用方法 新建一个空文档(重要&#xff1a;防止扰乱…...

贪心算法-买卖股票的最佳时机

买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天 的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股 票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易…...

文本操作基础知识:正则表达式

目录 摘要&#xff1a; 一、语法 二、匹配模式pattern 1、普通字符[ ] 2、限定字符 3、定位字符 4、运算字符( ) 三、修饰符flags 四、各语言的正则使用 1、Python的re 参考资料&#xff1a; 摘要&#xff1a; 常用匹配&#xff1a;[A-C]、[^A-C]、\w、\d、\n、\r、…...

【Scrapy】Scrapy教程6——提取数据

前一小节我们拿到了页面的数据,那页面中那么多内容,我们想要其中的部分内容,该如何获取呢?这就需要对我们下载到的数据进行解析,提取出来想要的数据,这节就讲讲如何提取数据。 引入 我们编辑保存下来的shouye.html文件看下,发现这是什么鬼,全是如下图的代码。 没错…...

PHP 网络编程介绍

PHP 学习资料 PHP 学习资料 PHP 学习资料 在当今数字化时代&#xff0c;网络编程是开发各类应用必不可少的技能。PHP 作为一门广泛应用于 Web 开发的编程语言&#xff0c;同样具备强大的网络编程能力。接下来&#xff0c;我们将深入探讨 PHP 中网络连接的建立、Socket 编程、…...

【C语言】C语言 食堂自动化管理系统(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【C语言】C语言 食堂自动化管理系统&#xff08;源…...

mybatis存储过程返回list

在MyBatis中&#xff0c;要想通过调用存储过程返回一个List集合&#xff0c;你需要在Mapper接口中定义一个方法&#xff0c;并使用Param注解来传递存储过程的参数。同时&#xff0c;你需要在Mapper XML文件中配置相应的<select>标签&#xff0c;并指定statementType"…...

【vue】nodejs版本管理利器:nvm

nvm&#xff08;Node Version Manager&#xff09;即 Node 版本管理器&#xff0c;是一个用于在系统中轻松安装、管理和切换不同版本 Node.js 的工具。 在实际开发中&#xff0c;不同的项目可能基于不同版本的 Node.js 构建。比如一个旧项目依赖于 Node.js 12.x 版本的特定功能…...

负载测试工具有哪些?

Apache JMeter Apache JMeter 是一款开源的性能测试工具&#xff0c;主要用于对 Web 应用程序进行功能、负载和压力测试。JMeter 支持多种协议和技术&#xff0c;包括 HTTP, HTTPS, FTP 和 WebSocket 等。通过模拟大量并发用户访问来评估应用程序的表现1。 jmeter -n -t testp…...

路由基础 | 路由引入实验 | 不同路由引入方式存在的问题

注&#xff1a;本文为 “路由基础 | 路由表 | 路由引入” 相关文章合辑。 未整理去重。 路由基本概念 1—— 路由表信息、路由进表以及转发流程、最长掩码匹配原则 静下心来敲木鱼已于 2023-11-26 14:06:22 修改 什么是路由 路由就是指导报文转发的路径信息&#xff0c;可以…...

网络安全不分家 网络安全不涉及什么

何为网络安全 信息安全是指系统的硬件、软件及其信息受到保护&#xff0c;并持续正常运行和服务。信息安全的实质是保护信息系统和信息资源免受各种威胁、干扰和破坏&#xff0c;即保证信息的安全性。 网络安全是指利用网络技术、管理和控制等措施&#xff0c;保证网络系统和…...

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言&#xff1a; GitHub Copilot 的最新更新为开发者带来了显著变化&#xff0c;其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令&#xff0c;并具备多级任务推理能力&#xff0c;这使得开发者在开发复杂功能时&#xff0c;可大幅减少…...

wordpress企业官网建站的常用功能

WordPress 是一个功能强大的内容管理系统(CMS)&#xff0c;广泛用于企业官网的建设。以下是企业官网建站中常用的 WordPress 功能&#xff1a; 1. 页面管理 自定义页面模板&#xff1a;企业官网通常需要多种页面布局&#xff0c;如首页、关于我们、产品展示、联系我们等。Wor…...

讯方·智汇云校华为官方授权培训机构

1.官方授权 讯方智汇云校是华为领先级授权培训机构&#xff08;华为授权培训合作伙伴&#xff08;HALP&#xff09;体系&#xff0c;分为认证、优选、领先三个等级&#xff0c;领先级是HALP最高级&#xff09;&#xff0c;代表着华为对培训合作伙伴在专业能力、师资队伍、合作…...

C语言中的文件

文章目录 文件1. 流1.1 文件缓冲1.2 标准流1.3 文本文件和二进制文件 2. 打开/关闭文件2.1 fopen2.2 fclose 3. 读写文件3.1 fgetc & fputc3.2 fgets & futs3.3 fscanf & fprintf3.4 fread & fwrite 4. 文件定位5. 错误处理5.1 errno 文件 1. 流 在 C 语言中…...

利用分治策略优化快速排序

1. 基本思想 分治快速排序&#xff08;Quick Sort&#xff09;是一种基于分治法的排序算法&#xff0c;采用递归的方式将一个数组分割成小的子数组&#xff0c;并通过交换元素来使得每个子数组元素按照特定顺序排列&#xff0c;最终将整个数组排序。 快速排序的基本步骤&#…...

前端工程化的具体实现细节

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

数据分析--数据清洗

一、数据清洗的重要性&#xff1a;数据质量决定分析成败 1.1 真实案例警示 电商平台事故&#xff1a;2019年某电商大促期间&#xff0c;因价格数据未清洗导致错误标价&#xff0c;产生3000万元损失医疗数据分析&#xff1a;未清洗的异常血压值&#xff08;如300mmHg&#xff…...

✨1.HTML、CSS 和 JavaScript 是什么?

✨✨ HTML、CSS 和 JavaScript 是构建网页的三大核心技术&#xff0c;它们相互协作&#xff0c;让网页呈现出丰富的内容、精美的样式和交互功能。以下为你详细介绍&#xff1a; &#x1f98b;1. HTML&#xff08;超文本标记语言&#xff09; 定义&#xff1a;HTML 是一种用于描…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...