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

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

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

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

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...