Java 8 新特性解读及应用实践
Java 8 新特性解读及应用实践
- 一、简介
- 二、Lambda表达式
- 三、流式编程
- 四、日期/时间API
- 1. 概述
- 2. LocalDate、LocalTime、LocalDateTime等类的使用
- 3. 格式化与解析
- 五、重复注解和类型注解
- 1. 概念与作用
- 2. 重复注解实例
- 3. 类型注解实例
- 六、小结回顾
一、简介
Java 8带来了众多重大改进和新特性。这些新特性使Java编程更便捷、更高效,并且增加了代码的可读性和可维护性
二、Lambda表达式
-
Lambda表达式是一个匿名函数,它可以作为一个函数接口(functional interface)的实例。
(parameters) -> expression
上述语法中,参数列表和表达式之间用箭头 " -> " 隔开。
-
函数式接口是只包含一个抽象方法的接口。Lambda表达式可以赋值给函数式接口类型的变量。
// 定义函数式接口 interface MyInterface {void myMethod(); }// 使用Lambda表达式创建MyInterface接口的实例 MyInterface myInterface = () -> System.out.println("Hello, world!");
-
Lambda表达式可以被用于各种应用场景,例如集合操作、事件处理等。
三、流式编程
-
流(Stream)是从源生成的一系列元素,支持顺序和并行聚合操作。
-
流可以用来操作集合、数组等数据源。
// 创建一个字符串list List<String> list = Arrays.asList("Java", "Python", "JavaScript");// 通过list创建一个流 Stream<String> stream = list.stream();
-
流支持中间操作和终止操作。中间操作返回一个新的流,可以链式调用多个中间操作;终止操作是最终结果的计算,只能调用一次。
// 中间操作:过滤出长度大于4的字符串 Stream<String> filteredStream = stream.filter(e -> e.length() > 4);// 中间操作:对长度大于4的字符串进行排序 Stream<String> sortedStream = filteredStream.sorted();// 终止操作:将流转换为数组,并输出 String[] resultArray = sortedStream.toArray(String[]::new); Arrays.stream(resultArray).forEach(System.out::println);
-
流式编程可以提高代码的简洁性和可读性,同时还可以自动进行并行处理等优化操作。
四、日期/时间API
1. 概述
Java 8引入了全新的日期/时间API,该API使用优雅且易于记忆的API方法代替了旧的Date和Calendar类。新的API提供了许多新特性,如更加精确的时间表示(纳秒级别)、不变性和线程安全性。
2. LocalDate、LocalTime、LocalDateTime等类的使用
Java 8提供了多个日期与时间相关的类,常用的有:
- LocalDate:表示日期,例如:2019-12-31。
- LocalTime:表示时间,例如:23:59:59.999。
- LocalDateTime:表示日期与时间,例如:2019-12-31T23:59:59.999。
- Instant:表示时间戳,可以精确到纳秒级别。
- ZonedDateTime:表示带有时区的日期与时间。
这些类都是不可变的,因此线程安全,可以通过工厂方法创建对象。例如:
LocalDateTime now = LocalDateTime.now(); // 当前时间
LocalDate date = LocalDate.of(2023, Month.MAY, 25); // 特定日期
LocalTime time = LocalTime.of(21, 8, 28, 0); // 特定时间
3. 格式化与解析
Java 8中新的日期/时间API还提供了格式化与解析功能,可以将日期/时间格式化为字符串,或者将字符串解析为日期/时间对象。
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = dateTime.format(formatter); // 格式化为字符串
LocalDateTime parsedDateTime = LocalDateTime.parse(formattedDateTime, formatter); // 解析为日期时间对象
- 应用实例
Java 8的日期/时间API可以应用于各种场景,例如:
// 计算两个日期之间的天数
LocalDate date1 = LocalDate.of(2023, Month.MAY, 25);
LocalDate date2 = LocalDate.of(2024, Month.MAY, 25);
long daysBetween = ChronoUnit.DAYS.between(date1, date2);// 打印出每个月包含多少天
YearMonth yearMonth = YearMonth.of(2023, Month.FEBRUARY);
int daysInMonth = yearMonth.lengthOfMonth();
System.out.printf("Days in month: %d%n", daysInMonth);// 判断一个特定的时间是否在另一个时间之前或之后
LocalDateTime dateTime1 = LocalDateTime.of(2023, Month.MAY, 25, 21, 8, 28);
LocalDateTime dateTime2 = LocalDateTime.of(2023, Month.MAY, 26, 21, 8, 28);
boolean isBefore = dateTime1.isBefore(dateTime2);
boolean isAfter = dateTime1.isAfter(dateTime2);
五、重复注解和类型注解
1. 概念与作用
Java 8引入了重复注解和类型注解的功能
重复注解允许在同一个元素上多次使用同一个注解,例如:
@Author(name = "Alice")
@Author(name = "Bob")
public class Book {// ...
}
类型注解允许在类型、方法、参数和变量等元素上使用注解,例如:
void process(@NonNull String param) {// ...
}class Example<@TypeParameter T> {// ...
}
2. 重复注解实例
创建一个@Tag注解,可以用于给类或方法添加标签。
@Repeatable(Tags.class)
public @interface Tag {String value();
}@Retention(RetentionPolicy.RUNTIME)
public @interface Tags {Tag[] value();
}@Tags({@Tag("java"), @Tag("programming")})
public class MyClass {// ...
}
3. 类型注解实例
创建一个@NonNull注解,表示该元素不能为空。
@Target({ElementType.TYPE_USE, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NonNull {
}public class Example {private @NonNull String name;public Example(@NonNull String name) {this.name = Objects.requireNonNull(name);}public void process(@NonNull String param) {// ...}
}
六、小结回顾
-
Java 8新特性回顾
Java 8引入了很多新特性,包括Lambda表达式、流处理API、日期/时间API、默认方法和接口增强等。这些新特性丰富了Java语言本身的功能,也提高了代码的可读性、可维护性和可重用性。 -
应用建议
在使用Java 8新特性的时候,应该关注以下几点:
- 确保JDK版本为1.8或更高版本。
- 熟悉新的API,并且适当地使用它们来简化代码。
- 重构现有代码,以利用新特性带来的优势。
相关文章:
Java 8 新特性解读及应用实践
Java 8 新特性解读及应用实践 一、简介二、Lambda表达式三、流式编程四、日期/时间API1. 概述2. LocalDate、LocalTime、LocalDateTime等类的使用3. 格式化与解析 五、重复注解和类型注解1. 概念与作用2. 重复注解实例3. 类型注解实例 六、小结回顾 一、简介 Java 8带来了众多…...
C++项目实战——基于多设计模式下的同步异步日志系统-④-日志系统框架设计
文章目录 专栏导读模块划分日志等级模块日志消息模块日志消息格式化模块日志消息落地模块日志器模块日志器管理模块异步线程模块 模块关系图 专栏导读 🌸作者简介:花想云 ,在读本科生一枚,C/C领域新星创作者,新星计划导…...
计算机专业毕业设计项目推荐02-个人医疗系统(Java+原生Js+Mysql)
个人医疗系统(Java原生JsMysql) **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以…...
Nginx__高级进阶篇之LNMP动态网站环境部署
动态网站和LNMP(LinuxNginxMySQLPHP)都是用于建立和运行 web 应用程序的技术。 动态网站是通过服务器端脚本语言(如 PHP、Python、Ruby等)动态生成网页内容的网站。通过这种方式,动态网站可以根据用户的不同请求生成不…...
Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来
在9月7日,Zebec创始人Sam做客社区,并进行了“Nautilus Chain以及$ZBC的未来”主题的AMA访谈。Sam在本次访谈中对Nautilus Chain生态的价值捕获、Zebec生态布局规划、可能会推出的Nautilus Chain治理通证NAUT进行了解读。本文将对本次AMA进行回顾与总结。…...
NXP iMX8MM 修改 UART4至 Cortex-A53 核心
By Toradex秦海 1). 简介 NXP iMX8MM SoC UART-4 接口在默认的 ATF(ARM Trusted Firmware) 中被 RDC 分配给了 Cortex-M4 核心,用作 M4 核心的 Debug UART。如果这时候在 Cortex-A53 核心 Linux Devcie-tree 配置中使能 UART-4,就会出现 Kernel Oops 错…...
C#控制台程序中使用log4.net来输出日志
Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 是优秀的 Apache log4j™ 框架到 Microsoft .NET 运行时的端口。 我喜欢他可以自定义输出,区分等级等特点。 导入库 我们在工程里添加NuGet的包。输入名称log4net ࿰…...
用GPT干的18件事,能够真正提高学习生产力,建议收藏
用GPT干的18件事,能够真正提高学习生产力,建议收藏。 语法更正 文本翻译 语言转换 代码解释 修复代码错误 作为百科全书 信息提取 好友聊天 创意生成器 采访问题 论文大纲 故事创作 问题类比 创建 SQL 需求 情感分析 将产品描述转变为广告 关键字提取 闲…...
线性代数的本质(二)——线性变换与矩阵
文章目录 线性变换与矩阵线性变换与二阶方阵常见的线性变换复合变换与矩阵乘法矩阵的定义列空间与基矩阵的秩逆变换与逆矩阵 线性变换与矩阵 线性变换与二阶方阵 本节从二维平面出发学习线性代数。通常选用平面坐标系 O x y Oxy Oxy ,基向量为 i , j \mathbf i,…...
JavaScript获取字符串的字节长度
概要 提示:大家都知道,获取字符串的长度可用length来获取。 那么获取这段字符串的字节数呢?英文字母肯定lenght和字节数都一样:都是1而中文lenght1,字节数2因此,需要作的就是把中文字符的字节数计算出来。 …...
[2023.09.13]: Rust Lang,避不开的所有权问题
Rust的所有权问题,在我学Rust的时候就跳过了,因为我知道这玩意儿没有场景就不好理解。没想到场景很快就出现了。 在开发Yew应用组件的时候,涉及到了事件,闭包,自然就引出了所有权问题。 话不多说,下面让我们…...
Redux中间件源码解析与实现
基本介绍 本文中涉及到的关键npm包的版本信息如下: react 的版本为18.2.0 redux的版本为4.1.2 redux-thunk版本为2.4.2 redux-promise版本为0.6.0 redux-logger版本为3.0.6 在Redux源码解析与实现(一)Redux源码解析与实现(二&…...
关于rsync用不了之后
1.尝试找出rsync使用错误原因: 我遇见一个问题:rsync:read errors mapping:communication error on send (70),我查了一下这个问题很大可能是网络链接导致的,然后我用nslookup指令查看了/train2…...
由一个多线程并发保存而引发的思考
1. 问题描述 问题描述,现A表(用户查看实验的次数)有user_id和exp_id两个字段,其中user_id加exp_id不唯一。B表有user_id,exp_id以及exp_num三个字段,其中user_id加exp_id唯一(表中未建唯一索引)。 现需要将A表的数据同步到B表,单机模式通过定时任务同步。A表的数据有…...
python-vlc
文章目录 关于 python-vlc安装使用关于 python-vlc Python vlc bindings github : https://github.com/oaubert/python-vlcPython bindings (ctypes-based) for VLC http://olivieraubert.net/vlc/python-ctypes/关于 VLC 可参考 macOS - 安装使用 VLC https://blog.csdn.net/…...
2023长城杯 web部分题目(seekingeasy_extension)
seeking 下载题目附件得到: <?php error_reporting(0); header("HINT:POST n range(1,10)");$image $_GET[image]; echo "这里什么也没有,或许吧。"; $allow range(1, 10); shuffle($allow); if (($_POST[n] $allow[0])) …...
2-1 张量数据结构
张量概念 张量是什么? 单个元素叫标量(scalar),一个序列叫向量(vector),多个序列组成的平面叫矩阵(matrix),多个平面组成的立方体叫张量(tensor&…...
QSqlQuery查询语句
SqlQuery 封装了在 QSqlDatabase 上执行的 SQL 查询中创建、导航和检索数据所涉及的功能。 可用于执行 DML(数据操作语言)语句,如 SELECT、INSERT、UPDATE 和 DELETE, 以及 DDL(数据定义语言)语句ÿ…...
用c语言编写出三底模型
以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据,判断是否出现三底形态,如果是,则输出买入信号,否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…...
15 Python使用MySQL
概述 在上一节,我们介绍了如何在Python中使用网络,包括:套接字编程、socketserver等内容。在这一节,我们将介绍如何在Python中使用MySQL。MySQL是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,…...
3、Nginx 常用的命令和配置文件
文章目录 3、nginx 常用的命令和配置文件3.1 nginx 常用的命令:3.2 nginx.conf 配置文件3.2.1 地址3.2.2 内容3.2.2 vim不正常退出后再次打开信息提示解决方法 3.3 第一部分:全局块3.4 第二部分:events 块3.4 第三部分:http 块①、…...
python经典百题之兔子出生问题
这是一个经典的 Fibonacci 数列问题,可以通过递归或循环来解决。 递归方法: 由题意可知,第 n 个月的兔子数等于第 n-1 个月的兔子数加上第 n-2 个月的兔子数。设 f(n) 表示第 n 个月的兔子数,则有: f(n) f(n-1) f…...
不定积分的概念和性质
目录 原函数 不定积分 不定积分的几何意义 原函数的存在定理 不定积分的性质 不定积分是微积分的一个关键部分,它涉及到一个函数的不定积分的计算。不定积分可以理解为求一个函数的原函数,也被称为反导数。原函数是一个函数,使得该函数的…...
远程访问服务器JupyterLab的配置方法
远程访问服务器JupyterLab的配置方法 环境及工具注意 基本步骤生成密码生成并修改配置文件*错误:jupyter localhost 已拒绝连接*后台运行jupyter后台关闭 其实就是在服务器运行JupyterLab,然后在本地浏览器访问 环境及工具 服务器:Ubuntu 1…...
Java native 关键字
如你在看 JDK 的源代码的时候,大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码,就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的,可能在其他…...
【线性代数】沉浸式线性代数在线学习网站
地址:http://immersivemath.com/ila/index.html 这是全球第一本带交互式图形的线性代数教材,作者是 J. Strm, K. strm, and T. Akenine-Mller。 全书一共十章,各章节内容如下: 接下来我将对各章节进行简单的总结,另外…...
Kotlin中特性、数据类、伴生对象、顶层函数
Kotlin中的函数参数和属性声明 在 Kotlin 中,函数参数和属性有不同的声明方式和行为。这些特性使得 Kotlin 代码更加安全、易于理解和维护。 函数参数的只读性 fun sum(a: Int, b: Int): Int {var modifiedA aif (modifiedA > 0) {modifiedA 1}//三元表达式v…...
《PostgreSQL物化视图:创建、维护与应用》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...
shell脚本之test命令
shell脚本之test命令 数值比较:2. 字符串比较:3. 文件测试:4. 逻辑操作:5. 其他测试: test命令在Shell脚本中用于进行条件测试和条件判断。它用于检查文件、字符串和数值的各种条件,并返回一个状态码&#…...
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。 目录 一、什么是装饰模式二、…...
个人怎么做网站优化/搜索推广是什么意思
记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的,但是客户反应说CPU占用很高,经…...
更换网站空间/网店seo关键词
不可否认,React Native是开发混合应用的未来。它提供了可扩展性、灵活性、速度、敏捷性、成本效益和卓越的性能。难怪这么多成功的公司依赖React Native来构建他们的应用程序。毕竟,在互联网时代,每个企业都需要一个高性能的应用程序来满足客…...
网站制作视频教程下载/新乡网站推广
介绍 我 们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都 会用到时间函数。还比如我们通过记录函数或者算…...
做外贸b2b网站/软文写作网站
概念 下载 安装 目录结构 启动 启动常遇到的问题 闪退 乱码 端口号被占用 关闭 1、直接点 X关闭 2、点击命令关闭 概念 Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免…...
wordpress 支付宝付款/广告代发平台
linux就该这么学 笔记(2) RPM(Red Hat Package Manage) 红帽软件包管理器, RPM有点像windows系统中的控制面板, 会建立统一的数据库, 详细记录软件信息并能够自动建立依赖关系,它生成具有.RPM扩展名的文件…...
网站开发及app开发公司/seo软文推广工具
免费获得《2017阿里技术年度精选》(678页),下载地址见文中说明2017年,在技术发展的历史上,一定是个特别的一年:柯洁与AlphaGo的惊世大战,无人咖啡店开放体验,AI设计师“鲁班”横空出…...