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

Java 8 新特性

Java 8 引入了一系列重要的新特性,极大地增强了 Java 语言的功能,尤其是在 函数式编程流处理日期时间 API默认方法 等方面。这些新特性不仅提升了代码的可读性和简洁性,还改善了并发处理的性能。以下是 Java 8 主要新特性的详细说明。


1. Lambda 表达式

1.1 什么是 Lambda 表达式?

Lambda 表达式使得 Java 代码更加简洁,能够传递行为。它是 Java 函数式编程的核心,可以用来替代匿名内部类,减少代码量并增强可读性。

1.2 Lambda 基本语法

(parameters) -> expression

例如,使用 Lambda 表达式创建一个简单的线程:

Runnable r = () -> System.out.println("Hello from thread");
new Thread(r).start();
示例
  • 传统写法:
List<String> list = Arrays.asList("Java", "Python", "JavaScript");
Collections.sort(list, new Comparator<String>() {public int compare(String s1, String s2) {return s1.compareTo(s2);}
});
  • 使用 Lambda 表达式:
List<String> list = Arrays.asList("Java", "Python", "JavaScript");
Collections.sort(list, (s1, s2) -> s1.compareTo(s2));
使用场景
  • 使用 Lambda 表达式可以替代匿名内部类,使得代码更加简洁和可读。
  • 常用于 集合的遍历、排序、过滤等操作

2. 函数式接口

2.1 什么是函数式接口?

一个接口如果只有 一个抽象方法,它就可以作为 函数式接口 使用,并可以用 @FunctionalInterface 注解进行标识。函数式接口可以直接用于 Lambda 表达式和方法引用。

@FunctionalInterface
interface MyFunction {void execute();  // 仅一个抽象方法
}

2.2 常用函数式接口

Java 8 提供了很多常用的内置函数式接口,例如:

  • Runnable:无返回值的操作。
  • Consumer:接受一个参数并执行操作,但没有返回值。
  • Function<T, R>:接受一个参数并返回一个结果。
  • Predicate:接受一个参数并返回一个布尔值。
  • Supplier:无参数,返回一个结果。

3. Stream API(流式 API)

3.1 什么是 Stream?

Stream 是对集合的 函数式编程式操作,可以用于 过滤、映射、排序等操作,使得 Java 集合操作更加简洁。

3.2 Stream 操作分类

  • 中间操作:返回一个新的 Stream,支持链式调用。常见的操作有:filter()map()sorted()distinct() 等。
  • 终止操作:触发计算并产生结果。常见的操作有:collect()forEach()reduce() 等。

3.3 示例:

List<String> list = Arrays.asList("apple", "banana", "orange", "kiwi");// 使用 Stream 进行过滤和转换
List<String> result = list.stream().filter(s -> s.startsWith("a")).map(String::toUpperCase).collect(Collectors.toList());
System.out.println(result);  // [APPLE]
使用场景
  • 数据处理和转换:Stream 使得数据处理更加直观和简洁,尤其是在处理集合(如 ListSet)时。
  • 并行处理:Stream 可以轻松实现 并行处理,提高大数据集的处理效率。

4. 默认方法(Default Methods)

4.1 什么是默认方法?

默认方法是接口中可以定义有实现的方法。通过使用 default 关键字,接口可以提供 默认实现,从而避免修改现有接口时影响已有实现。

4.2 示例

interface MyInterface {default void print() {System.out.println("Hello from MyInterface");}
}class MyClass implements MyInterface {// 无需实现 print() 方法,接口提供了默认实现
}public class Test {public static void main(String[] args) {MyClass obj = new MyClass();obj.print();  // 输出:Hello from MyInterface}
}
使用场景
  • 当接口需要在多个实现类中使用相同的默认方法时,使用默认方法可以避免在所有实现类中都重复实现该方法。

5. 新的日期时间 API(java.time)

5.1 引入新的日期时间 API

Java 8 引入了新的日期时间 API (java.time),其中包括:

  • LocalDate:表示日期(无时间)。
  • LocalTime:表示时间(无日期)。
  • LocalDateTime:表示日期和时间。
  • ZonedDateTime:表示带时区的日期时间。

5.2 新 API 示例

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;public class DateTimeExample {public static void main(String[] args) {LocalDate date = LocalDate.now();  // 获取当前日期LocalTime time = LocalTime.now();  // 获取当前时间LocalDateTime dateTime = LocalDateTime.now();  // 获取当前日期和时间System.out.println("Current Date: " + date);System.out.println("Current Time: " + time);System.out.println("Current DateTime: " + dateTime);}
}
使用场景
  • 处理日期、时间和时区时使用新的 java.time 包,避免了旧 API(java.util.DateCalendar)的一些不便之处,如线程不安全、可变性等问题。

6. Optional 类

6.1 什么是 Optional?

Optional 类是一个容器对象,用来表示可能为 null 的值,避免显式的空值检查。它主要通过 ifPresent()orElse()map() 等方法来处理 null 值。

6.2 示例

import java.util.Optional;public class OptionalExample {public static void main(String[] args) {String name = "Java";Optional<String> optName = Optional.ofNullable(name);  // 包装非 null 值// 如果值存在,打印optName.ifPresent(System.out::println);  // Java// 如果值为空,提供默认值System.out.println(optName.orElse("Unknown"));  // Java}
}
使用场景
  • Optional 常用于方法返回值,表示该值可能为空,避免了显式的空值检查和 NullPointerException

7. 方法引用(Method References)

7.1 什么是方法引用?

方法引用是 Lambda 表达式的一种简化形式,允许直接引用类的方法。可以用 Class::methodNameobject::methodName 来引用方法。

7.2 示例

import java.util.Arrays;
import java.util.List;public class MethodReferenceExample {public static void main(String[] args) {List<String> list = Arrays.asList("Java", "Python", "JavaScript");// 使用 Lambda 表达式list.forEach(s -> System.out.println(s));// 使用方法引用list.forEach(System.out::println);}
}
使用场景
  • 方法引用可以简化代码,尤其是在使用集合处理和流操作时,提升代码的简洁性。

8. 并行流(Parallel Streams)

8.1 什么是并行流?

Java 8 的 Stream API 支持并行流(Parallel Stream),它可以将流的操作自动分成多个任务并并行执行,利用多核 CPU 提高性能。

8.2 示例

import java.util.Arrays;
import java.util.List;public class ParallelStreamExample {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用并行流进行计算int sum = list.parallelStream().mapToInt(Integer::intValue).sum();System.out.println(sum);  // 输出 55}
}
使用场景
  • 适用于数据量大的操作,尤其是需要进行计算和聚合时,可以通过并行流充分利用多核处理器提高性能。

总结

Java 8 引入的多个特性,如 Lambda 表达式、Stream API、Optional、默认方法等,极大地提高了代码的简洁性和可维护性。它们使得 Java 在 函数式编程并行计算 方面的能力得到了显著提升。

相关文章:

Java 8 新特性

Java 8 引入了一系列重要的新特性&#xff0c;极大地增强了 Java 语言的功能&#xff0c;尤其是在 函数式编程、流处理、日期时间 API 和 默认方法 等方面。这些新特性不仅提升了代码的可读性和简洁性&#xff0c;还改善了并发处理的性能。以下是 Java 8 主要新特性的详细说明。…...

知识库技术选型:主流Embedding模型特性对比

知识库技术选型&#xff1a;主流Embedding模型特性对比 1. 知识库与大模型结合的背景 知识库是存储和管理结构化知识的系统&#xff0c;广泛应用于问答系统、推荐系统和搜索引擎等领域。随着大语言模型&#xff08;LLM&#xff09;的发展&#xff0c;知识库与大模型的结合成为…...

CAN总线通信协议学习2——数据链路层之帧格式

1 帧格式 帧格式可理解为定义了传输的数据&#xff08;叫报文&#xff09;应该“长什么样”来传输&#xff0c;也为后续设定一些规则如错误检查机制提供了思路。 首先&#xff0c;帧格式可分为以下5种类型&#xff1a; PS&#xff1a;CAN总线任意一个设备可当收也可当发&#…...

基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局高阶应用

文字目录 前言第一章、生态安全评价理论及方法介绍一、生态安全评价简介二、生态服务能力简介三、生态安全格局构建研究方法简介 第二章、平台基础一、ArcGIS Pro介绍二、Python环境配置 第三章、数据获取与清洗一、数据获取&#xff1a;二、数据预处理&#xff08;ArcGIS Pro及…...

神经网络在电力电子与电机控制中的应用

神经网络&#xff08;Neural Networks&#xff09;简介 神经网络是一种受生物神经元启发的机器学习模型&#xff0c;能够通过大量数据学习输入与输出之间的非线性映射关系。其核心结构包括&#xff1a; 输入层&#xff1a;接收外部数据&#xff08;如传感器信号、控制指令&…...

llama-factory || AutoDL平台

报错如下&#xff1a; rootautodl-container-d83e478b47-3def8c49:~/LLaMA-Factory# llamafactory-cli webui * Running on local URL: http://0.0.0.0:7860Could not create share link. Missing file: /root/miniconda3/lib/python3.10/site-packages/gradio/frpc_linux_am…...

数学建模:MATLAB极限学习机解决回归问题

一、简述 极限学习机是一种用于训练单隐层前馈神经网络的算法&#xff0c;由输入层、隐藏层、输出层组成。 基本原理&#xff1a; 输入层接受传入的样本数据。 在训练过程中随机生成从输入层到隐藏层的所有连接权重以及每个隐藏层神经元的偏置值&#xff0c;这些参数在整个…...

力扣785. 判断二分图

力扣785. 判断二分图 题目 题目解析及思路 题目要求将所有节点分成两部分&#xff0c;每条边的两个端点都必须在不同集合中 二分图&#xff1a;BFS/DFS/并查集 因为图不一定联通&#xff0c;所以枚举所有点都做bfs(如果没联通的话) 代码 class Solution { public:bool is…...

【硬件工程师成长】之是否需要组合电容进行滤波的考虑

在电子电路设计中&#xff0c;判断是否需要使用组合电容进行滤波&#xff0c;需综合考虑以下因素&#xff1a; 1. 噪声频谱分析 高频与低频噪声共存&#xff1a;若电源或信号中同时存在低频&#xff08;如工频纹波&#xff09;和高频噪声&#xff08;如开关电源的开关噪声、数字…...

Pythonweb开发框架—Flask工程创建和@app.route使用详解

1.创建工程 如果pycharm是专业版&#xff0c;直接NewProject—>Flask 填写工程name和location后&#xff0c;点击右下角【create】&#xff0c;就会新建一个flask工程&#xff0c;工程里默认会建好一个templates文件夹、static文件夹、一个app.py文件 templates&#xff1…...

005 公网访问 docker rocketmq

文章目录 创建自定义网络创建NameServer容器创建Broker容器正式开始启动 Nameserver 容器启动 Broker 容器并关联 Nameserverdocker exec -it rmqbroker vi /etc/rocketmq/broker.conf检查 namesrv 解析检查 Broker 注册状态Nameserver 日志Broker 日志检查容器日志手动指定 Br…...

C++11中的右值引用和完美转发

C11中的右值引用和完美转发 右值引用 右值引用是 C11 引入的一种新的引用类型&#xff0c;用 && 表示。它主要用于区分左值和右值&#xff0c;并且可以实现移动语义&#xff0c;避免不必要的深拷贝&#xff0c;提高程序的性能。左值通常是可以取地址的表达式&#xf…...

txt 转 json 使用python语言

需求: 把如下的txt文档转成json输出 代码 import jsondef txt_to_json(input_file, output_file):data_list []with open(input_file, r, encodingutf-8) as f:for line in f:# 分割数据并去除换行符parts line.strip().split(,)print(f"{parts}")print(type(par…...

Android Logcat 高效调试指南

工具概览 Logcat 是 Android SDK 提供的命令行日志工具&#xff0c;支持灵活过滤、格式定制和实时监控&#xff0c;官方文档详见 Android Developer。 基础用法 命令格式 [adb] logcat [<option>] ... [<filter-spec>] ... 执行方式 直接调用&#xff08;通过ADB守…...

【Linux】从入门到精通:Make与Makefile完全指南

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;从入门到精通&#xff1a;Make与Makefile完全指南 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;C | C语言 | Linux | Python | 数据结构和算法 | 算法专题 &#x1…...

leetcode0014 最长公共前缀 -easy

1 题目&#xff1a;最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&a…...

【星云 Orbit-F4 开发板】07. 用判断数据尾来接收据的串口通用程序框架

【星云 Orbit-F4 开发板】用判断数据尾来接收一串数据的串口通用程序框架 摘要 本文介绍了一种基于STM32F407微控制器的串口数据接收通用程序框架。该框架通过判断数据尾来实现一串数据的完整接收&#xff0c;适用于需要可靠数据传输的应用场景。本文从零开始&#xff0c;详细…...

LLVM - 编译器前端 - 将源文件转换为抽象语法树(一)

一:概述 编译器通常分为两部分——前端和后端。在本文中,我们将实现编程语言的前端部分——即主要处理源语言的部分。我们将学习现实世界编译器使用的技术,并将其应用到我们的编程语言中。 本文将从定义编程语言的语法开始,最终生成一个抽象语法树(AST),这是代码生成的基…...

02_NLP文本预处理之文本张量表示法

文本张量表示法 概念 将文本使用张量进行表示,一般将词汇表示为向量,称为词向量,再由各个词向量按顺序组成矩阵形成文本表示 例如: ["人生", "该", "如何", "起头"]># 每个词对应矩阵中的一个向量 [[1.32, 4,32, 0,32, 5.2],[3…...

深圳SMT贴片加工核心工艺解析

内容概要 深圳作为全球电子制造产业的核心集聚区&#xff0c;其SMT贴片加工技术始终引领行业创新方向。本文聚焦深圳电子制造企业在高密度、微型化组件加工中的核心工艺体系&#xff0c;系统解析从锡膏印刷到成品检测的全流程关键技术。通过梳理SMT产线中设备参数设定、工艺条…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...