当前位置: 首页 > 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产线中设备参数设定、工艺条…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...