【Java进阶篇】——第11篇:Java 8 新特性及使用

第11篇:Java 8 新特性及使用

Java 8 是一次里程碑式的更新,引入了多项革新特性,极大地提升了开发效率和代码表现力。本文将从 Lambda表达式Stream API时间日期APIOptional类 等核心特性出发,结合实战场景和最佳实践,全面解析Java 8的核心功能。


1. Lambda表达式与函数式编程

1.1 Lambda表达式基础

Lambda表达式允许以简洁的语法实现函数式接口(仅含一个抽象方法的接口),替代传统的匿名内部类。

语法结构:

(参数列表) -> { 代码逻辑 }

示例:线程创建对比

// 传统写法
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Thread running");}
}).start();// Lambda简化
new Thread(() -> System.out.println("Thread running")).start();
1.2 函数式接口

Java 8 内置了四大核心函数式接口:

  • Consumer<T>:接收一个参数,无返回值。
    Consumer<String> print = s -> System.out.println(s);
    print.accept("Hello");
    
  • Supplier<T>:无参数,返回一个值。
    Supplier<Double> random = Math::random;
    System.out.println(random.get());
    
  • Function<T, R>:接收T类型参数,返回R类型。
    Function<String, Integer> length = String::length;
    System.out.println(length.apply("Java")); // 4
    
  • Predicate<T>:接收T类型参数,返回布尔值。
    Predicate<Integer> isEven = n -> n % 2 == 0;
    System.out.println(isEven.test(4)); // true
    
1.3 方法引用

进一步简化Lambda表达式:

  • 静态方法引用ClassName::staticMethod
    List<Integer> numbers = Arrays.asList(1, 2, 3);
    numbers.forEach(System.out::println);
    
  • 实例方法引用instance::method
    String str = "Java";
    Supplier<Integer> length = str::length;
    
  • 构造器引用ClassName::new
    Supplier<List<String>> listSupplier = ArrayList::new;
    

2. Stream API

Stream API 提供了一种声明式处理集合数据的方式,支持顺序和并行操作,极大简化了集合处理。

2.1 Stream操作分类
  • 中间操作:返回新Stream,延迟执行(如filter, map, sorted)。
  • 终端操作:触发计算,关闭Stream(如forEach, collect, count)。

示例:集合处理

List<String> languages = Arrays.asList("Java", "Python", "C++", "Go");// 过滤长度>3,转大写,排序,收集为List
List<String> result = languages.stream().filter(s -> s.length() > 3).map(String::toUpperCase).sorted().collect(Collectors.toList());
// 输出:[C++, GO, JAVA, PYTHON]
2.2 并行流加速处理

通过parallelStream()利用多核CPU提升性能:

List<Integer> numbers = IntStream.range(1, 10_000_000).boxed().collect(Collectors.toList());// 顺序流计算总和
long sum1 = numbers.stream().mapToLong(Integer::longValue).sum();// 并行流计算总和
long sum2 = numbers.parallelStream().mapToLong(Integer::longValue).sum();
2.3 常用收集器(Collectors)
  • 转换为集合:toList(), toSet(), toMap()
  • 分组统计:groupingBy(), partitioningBy()
  • 聚合计算:summingInt(), averagingDouble(), maxBy()

示例:统计单词频率

List<String> words = Arrays.asList("apple", "banana", "apple", "orange");
Map<String, Long> frequency = words.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// 输出:{apple=2, orange=1, banana=1}

3. 时间日期API(java.time)

Java 8 全新的时间日期API解决了旧版DateCalendar的设计缺陷,提供不可变、线程安全的类。

3.1 核心类
  • LocalDate:日期(年月日)。
    LocalDate date = LocalDate.now(); // 当前日期
    LocalDate independenceDay = LocalDate.of(2023, Month.JULY, 4);
    
  • LocalTime:时间(时分秒)。
    LocalTime time = LocalTime.parse("15:30:45");
    
  • LocalDateTime:日期时间组合。
    LocalDateTime dateTime = LocalDateTime.of(2023, 12, 31, 23, 59);
    
  • Duration:时间间隔(基于时间单位)。
    Duration duration = Duration.between(startTime, endTime);
    
  • Period:日期间隔(基于年、月、日)。
    Period period = Period.between(startDate, endDate);
    
3.2 格式化与解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse("2023-08-25 14:30:00", formatter);
String formatted = dateTime.format(formatter); // "2023-08-25 14:30:00"

4. Optional类

Optional用于优雅处理null值,避免空指针异常(NPE)。

4.1 基本使用
Optional<String> optional = Optional.ofNullable(getName());// 存在值时执行操作
optional.ifPresent(name -> System.out.println("Name: " + name));// 提供默认值
String name = optional.orElse("Unknown");// 抛出异常
String value = optional.orElseThrow(() -> new IllegalArgumentException("值不能为空"));
4.2 链式操作
Optional<User> user = Optional.ofNullable(getUser());
String street = user.map(User::getAddress).map(Address::getStreet).orElse("No street");

5. 接口默认方法与静态方法

Java 8 允许接口包含默认方法和静态方法,增强接口的扩展能力。

5.1 默认方法
public interface Vehicle {void run();default void honk() {System.out.println("Beep beep!");}
}public class Car implements Vehicle {@Overridepublic void run() {System.out.println("Car is running");}
}
5.2 静态方法
public interface MathUtils {static int add(int a, int b) {return a + b;}
}int sum = MathUtils.add(3, 5); // 8

6. 其他新特性

6.1 重复注解

允许在同一位置多次使用相同注解:

@Retention(RetentionPolicy.RUNTIME)
public @interface Roles {Role[] value();
}@Repeatable(Roles.class)
public @interface Role {String value();
}@Role("admin")
@Role("user")
public class User { }
6.2 类型注解

注解可应用于任何类型(如泛型、方法返回值):

List<@NonNull String> list = new ArrayList<>();
6.3 方法参数反射

通过Parameter类获取方法参数名(需编译时添加-parameters参数):

public void printInfo(@NotNull String name, int age) {// ...
}Method method = User.class.getMethod("printInfo", String.class, int.class);
Parameter[] parameters = method.getParameters();
System.out.println(parameters[0].getName()); // 输出name

7. 实战案例与最佳实践

案例1:使用Stream优化集合操作
// 传统写法
List<String> filteredNames = new ArrayList<>();
for (User user : users) {if (user.getAge() > 18) {filteredNames.add(user.getName());}
}// Stream优化
List<String> filteredNames = users.stream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toList());
案例2:时间日期计算
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusDays(7);
Period period = Period.between(today, nextWeek);
System.out.println("间隔天数:" + period.getDays()); // 7
最佳实践:
  1. 优先使用Lambda和Stream:简化代码,提升可读性。
  2. 避免过度并行化:并行流适用于大数据量且无状态操作。
  3. 时间处理使用java.time:替代DateCalendar
  4. 善用Optional减少NPE:但避免滥用(如不要用于集合字段)。

8. 总结

Java 8 的革新特性为开发者提供了更强大的工具集:

  • Lambda与Stream:函数式编程简化集合操作。
  • 时间日期API:更安全、更直观的时间处理。
  • Optional:优雅处理空值,减少NPE。
  • 接口增强:默认方法与静态方法提升灵活性。

通过合理利用这些特性,可以显著提升代码质量、可维护性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20421.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 3.29.0 新特性 CupertinoNavigationBar 可配置bottom属性

Flutter 3.29版本优化了开发流程并提升了性能&#xff0c;对 Impeller、Cupertino、DevTools 等进行了更新。 CupertinoNavigationBar和CupertinoSliverNavigationBar现在接受底部小部件&#xff0c;通常是搜索字段或分段控件。 例如本小节内容就是放置了一个输入框&#xff…

Vue 3最新组件解析与实践指南:提升开发效率的利器

目录 引言 一、Vue 3核心组件特性解析 1. Composition API与组件逻辑复用 2. 内置组件与生命周期优化 3. 新一代UI组件库推荐 二、高级组件开发技巧 1. 插件化架构设计 2. 跨层级组件通信 三、性能优化实战 1. 惰性计算与缓存策略 2. 虚拟滚动与列表优化 3. Tree S…

数据结构----哈希表的插入与输出

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> typedef int datatype;typedef struct Node {struct Node *next;datatype data; }*Linklist;//创建节点 Linklist Create_node() {Linklist p(Linklist)malloc(sizeof(…

QT QLabel加载图片等比全屏自适应屏幕大小显示

最近在工作项目中,遇到一个需求: 1.使用QLabel显示一张图片; 2.当点击这个QLabel时,需要全屏显示;但不能改变原来的尺寸; 3.当点击放大后的QLabel时,恢复原有大小. 于是乎,就有了本篇博客,介绍如何实现这样的功能. 一、演示效果 在一个水平布局中&#xff0c;添加两个Lable用…

eNSP防火墙综合实验

一、实验拓扑 二、ip和安全区域配置 1、防火墙ip和安全区域配置 新建两个安全区域 ip配置 Client1 Client2 电信DNS 百度web-1 联通DNS 百度web-2 R2 R1 三、DNS透明代理相关配置 1、导入运营商地址库 2、新建链路接口 3、配置真实DNS服务器 4、创建虚拟DNS服务器 5、配置D…

ios苹果手机使用AScript应用程序实现UI自动化操作,非常简单的一种方式

现在要想实现ios的ui自动化还是非常简单的&#xff0c;只需要安装AScript这个自动化工具就可以了&#xff0c;而且安卓&#xff0c;iso还有windows都支持&#xff0c;非常好用。 在ios端安装之后&#xff0c;需要使用mac电脑或者windows电脑激活一下 使用Windows电脑激活​ 激…

CommonLang3-使用介绍

摘自&#xff1a;https://www.cnblogs.com/haicheng92/p/18721636 学习要带着目的&#xff0c;参照现实问题 本次目标&#xff1a; 了解 CommonsLang3 API 文档&#xff0c;找对路后以后开发直接查询 API 文档&#xff0c;摈弃盲目的百度掌握基础的字符串、日期、数值等工具…

Qt:多元素控件

目录 多元素控件介绍 QListWidget QTableWidget QTreeWidget 多元素控件介绍 多元素控件表示这个控件中包含了很多的元素&#xff0c;元素可能指的是字符串&#xff0c;也可以指的是更加复杂的数据结构、图片等等 Qt 中提供的多元素控件有: QListWidgetQListViewQTableW…

基于YOLO11深度学习的心脏超声图像间隔壁检测分割与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

二叉树链式结构:数据结构中的灵动之舞

目录 前言 一、 前置说明 二、二叉树的遍历 2.1前序遍历 2.2中序遍历 2.3 后序遍历 2.4层序遍历 三、二叉树的遍历的应用 3.1二叉树节点个数&#xff1a; 3.2二叉树的高度 3.3 二叉树第k层的节点的个数 3.4二叉树的查找 总结 前言 在数据结构的世界里&#xff0c;二叉…

Tomcat下载,安装,配置终极版(2024)

Tomcat下载&#xff0c;安装&#xff0c;配置终极版&#xff08;2024&#xff09; 1. Tomcat下载和安装 进入Apache Tomcat官网&#xff0c;我们可以看到这样一个界面。 现在官网目前最新版是Tomcat11&#xff0c;我用的是Java17&#xff0c;在这里我们选择Tomcat10即可。Tom…

Android Studio - Android Studio 查看项目的 Android SDK 版本(4 种方式)

一、通过项目级 build.gradle 文件 1、基本介绍 在项目级 build.gradle 文件中&#xff0c;查看 compileSdk、minSdk、targetSdk 字段 或者是 compileSdkVersion、minSdkVersion、targetSdkVersion 字段 // 看到的可能是android {compileSdk 32defaultConfig {minSdk 21tar…

linux云服务器部署deepseek,并通过网页访问

参考视频&#xff1a;https://www.douyin.com/root/search/linux%E5%AE%89%E8%A3%85%20deepseek?aid3aa2527c-e4f2-4059-b724-ab81a140fa8b&modal_id7468518885570940214&typegeneral 修改ollama配置文件 vim /etc/systemd/system/ollama.service 我的电脑硬盘只有4…

【AI】mac 本地部署 Dify 实现智能体

下载 Ollama 访问 Ollama 下载页&#xff0c;下载对应系统 Ollama 客户端。或者参考文章【实战AI】macbook M1 本地ollama运行deepseek_m1 max可以跑deepseek吗-CSDN博客 dify 开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力&am…

Jenkins介绍

什么是Jenkins Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成和持续交付&#xff08;CI/CD&#xff09;。它帮助开发团队自动化构建、测试和部署软件&#xff0c;从而提高开发效率和软件质量。 如果一个系统是前后端分离的开发模式&#xff0c;在集成阶段会需…

如何使用 vxe-table grid 全配置式给单元格字段格式化内容,格式化下拉选项内容

如何使用 vxe-table grid 全配置式给单元格字段格式化内容&#xff0c;格式化下拉选项内容 公司的业务需求是自定义配置好的数据源&#xff0c;通过在列中配置好数据&#xff0c;全 json 方式直接返回给前端渲染&#xff0c;不需要写任何格式化方法。 官网&#xff1a;https:/…

【弹性计算】IaaS 和 PaaS 类计算产品

《弹性计算产品》系列&#xff0c;共包含以下文章&#xff1a; 云服务器&#xff1a;实例、存储、网络、镜像、快照容器、裸金属云上运维IaaS 和 PaaS 类计算产品 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680…

【Spring详解二】容器的基本实现

二、容器的基本实现 2.1 容器的基本用法 package com.xxx; public class Hello {public void sayHello() {System.out.println("Hello, spring");} } public static void main(String[] args) {//XmlBeanFactory 在 Spring3.1 以后废弃BeanFactory beanFactory ne…

计算机毕业设计Python考研院校推荐系统 考研分数线预测 考研推荐系统 考研可视化(代码+LW文档+PPT+讲解视频)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Ubuntu 系统 LVM 逻辑卷扩容教程

Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中&#xff0c;LVM&#xff08;Logical Volume Manager&#xff09;是一种逻辑卷管理工具&#xff0c;允许管理员动态调整磁盘空间&#xff0c;而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷&#xff0c;以实现…