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 使得数据处理更加直观和简洁,尤其是在处理集合(如
List、Set)时。 - 并行处理: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.Date和Calendar)的一些不便之处,如线程不安全、可变性等问题。
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::methodName 或 object::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 引入了一系列重要的新特性,极大地增强了 Java 语言的功能,尤其是在 函数式编程、流处理、日期时间 API 和 默认方法 等方面。这些新特性不仅提升了代码的可读性和简洁性,还改善了并发处理的性能。以下是 Java 8 主要新特性的详细说明。…...
知识库技术选型:主流Embedding模型特性对比
知识库技术选型:主流Embedding模型特性对比 1. 知识库与大模型结合的背景 知识库是存储和管理结构化知识的系统,广泛应用于问答系统、推荐系统和搜索引擎等领域。随着大语言模型(LLM)的发展,知识库与大模型的结合成为…...
CAN总线通信协议学习2——数据链路层之帧格式
1 帧格式 帧格式可理解为定义了传输的数据(叫报文)应该“长什么样”来传输,也为后续设定一些规则如错误检查机制提供了思路。 首先,帧格式可分为以下5种类型: PS:CAN总线任意一个设备可当收也可当发&#…...
基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局高阶应用
文字目录 前言第一章、生态安全评价理论及方法介绍一、生态安全评价简介二、生态服务能力简介三、生态安全格局构建研究方法简介 第二章、平台基础一、ArcGIS Pro介绍二、Python环境配置 第三章、数据获取与清洗一、数据获取:二、数据预处理(ArcGIS Pro及…...
神经网络在电力电子与电机控制中的应用
神经网络(Neural Networks)简介 神经网络是一种受生物神经元启发的机器学习模型,能够通过大量数据学习输入与输出之间的非线性映射关系。其核心结构包括: 输入层:接收外部数据(如传感器信号、控制指令&…...
llama-factory || AutoDL平台
报错如下: 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极限学习机解决回归问题
一、简述 极限学习机是一种用于训练单隐层前馈神经网络的算法,由输入层、隐藏层、输出层组成。 基本原理: 输入层接受传入的样本数据。 在训练过程中随机生成从输入层到隐藏层的所有连接权重以及每个隐藏层神经元的偏置值,这些参数在整个…...
力扣785. 判断二分图
力扣785. 判断二分图 题目 题目解析及思路 题目要求将所有节点分成两部分,每条边的两个端点都必须在不同集合中 二分图:BFS/DFS/并查集 因为图不一定联通,所以枚举所有点都做bfs(如果没联通的话) 代码 class Solution { public:bool is…...
【硬件工程师成长】之是否需要组合电容进行滤波的考虑
在电子电路设计中,判断是否需要使用组合电容进行滤波,需综合考虑以下因素: 1. 噪声频谱分析 高频与低频噪声共存:若电源或信号中同时存在低频(如工频纹波)和高频噪声(如开关电源的开关噪声、数字…...
Pythonweb开发框架—Flask工程创建和@app.route使用详解
1.创建工程 如果pycharm是专业版,直接NewProject—>Flask 填写工程name和location后,点击右下角【create】,就会新建一个flask工程,工程里默认会建好一个templates文件夹、static文件夹、一个app.py文件 templates࿱…...
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 引入的一种新的引用类型,用 && 表示。它主要用于区分左值和右值,并且可以实现移动语义,避免不必要的深拷贝,提高程序的性能。左值通常是可以取地址的表达式…...
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 提供的命令行日志工具,支持灵活过滤、格式定制和实时监控,官方文档详见 Android Developer。 基础用法 命令格式 [adb] logcat [<option>] ... [<filter-spec>] ... 执行方式 直接调用(通过ADB守…...
【Linux】从入门到精通:Make与Makefile完全指南
欢迎来到 CILMY23 的博客 🏆本篇主题为:从入门到精通:Make与Makefile完全指南 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:C | C语言 | Linux | Python | 数据结构和算法 | 算法专题 …...
leetcode0014 最长公共前缀 -easy
1 题目:最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: 输入&a…...
【星云 Orbit-F4 开发板】07. 用判断数据尾来接收据的串口通用程序框架
【星云 Orbit-F4 开发板】用判断数据尾来接收一串数据的串口通用程序框架 摘要 本文介绍了一种基于STM32F407微控制器的串口数据接收通用程序框架。该框架通过判断数据尾来实现一串数据的完整接收,适用于需要可靠数据传输的应用场景。本文从零开始,详细…...
LLVM - 编译器前端 - 将源文件转换为抽象语法树(一)
一:概述 编译器通常分为两部分——前端和后端。在本文中,我们将实现编程语言的前端部分——即主要处理源语言的部分。我们将学习现实世界编译器使用的技术,并将其应用到我们的编程语言中。 本文将从定义编程语言的语法开始,最终生成一个抽象语法树(AST),这是代码生成的基…...
02_NLP文本预处理之文本张量表示法
文本张量表示法 概念 将文本使用张量进行表示,一般将词汇表示为向量,称为词向量,再由各个词向量按顺序组成矩阵形成文本表示 例如: ["人生", "该", "如何", "起头"]># 每个词对应矩阵中的一个向量 [[1.32, 4,32, 0,32, 5.2],[3…...
深圳SMT贴片加工核心工艺解析
内容概要 深圳作为全球电子制造产业的核心集聚区,其SMT贴片加工技术始终引领行业创新方向。本文聚焦深圳电子制造企业在高密度、微型化组件加工中的核心工艺体系,系统解析从锡膏印刷到成品检测的全流程关键技术。通过梳理SMT产线中设备参数设定、工艺条…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
