Java 11 到 Java 8 的兼容性转换

Java 11 到 Java 8 的兼容性转换

在这里插入图片描述

欲倚绿窗伴卿卿,颇悔今生误道行。有心持钵丛林去,又负美人一片情。
静坐修观法眼开,祈求三宝降灵台,观中诸圣何曾见?不请情人却自来。
入山投谒得道僧,求教上师说因明。争奈相思无拘检,意马心猿到卿卿。
曾虑多情损梵行,入山又恐别倾城,世间安得两全法,不负如来不负卿

随着Java版本的更新,新的特性和改进不断被引入以提升开发效率和性能。然而,对于仍在使用Java 8的项目,需要将使用Java 11特性的代码转换为兼容Java 8的形式。难搞啊,世间安有两全法!

1. 使用InputStream和文件I/O

Java 11引入了便利的方法如InputStream.readAllBytes()Files.writeString()来简化文件操作。但在Java 8中,这些方法并不存在,因此需要使用替代方案。

原Java 11代码:

public boolean createOrUpdateFile(final Path path, final ByteArrayInputStream stream) {if (!Files.exists(path)) {return createFile(path, stream);} else {try {Files.write(path, stream.readAllBytes());return true;} catch (IOException e) {e.printStackTrace();}}return false;
}

转换为Java 8的代码:

public boolean createOrUpdateFile(final Path path, final ByteArrayInputStream stream) {if (!Files.exists(path)) {return createFile(path, stream);} else {try {byte[] buffer = new byte[stream.available()];stream.read(buffer);Files.write(path, buffer);return true;} catch (IOException e) {e.printStackTrace();}}return false;
}

2. URL连接和异常处理

在Java 11中,可以直接使用InputStream.readAllBytes()InputStream读取所有字节。Java 8中需要手动处理。

原Java 11代码:

if (url == null || url.isEmpty()) {throw new RuntimeException("Url argument is not specified");
}
URL uri = new URL(url);
HttpURLConnection connection = (HttpURLConnection) uri.openConnection();
connection.setConnectTimeout(FILE_SAVE_TIMEOUT);
InputStream stream = connection.getInputStream();
int statusCode = connection.getResponseCode();
if (statusCode != HttpStatus.OK.value()) {connection.disconnect();throw new RuntimeException("Document editing service returned status: " + statusCode);
}
if (stream == null) {connection.disconnect();throw new RuntimeException("Input stream is null");
}
return stream.readAllBytes();

转换为Java 8的代码:

if (url == null || url.isEmpty()) {throw new RuntimeException("Url argument is not specified");
}
URL uri = new URL(url);
HttpURLConnection connection = (HttpURLConnection) uri.openConnection();
connection.setConnectTimeout(FILE_SAVE_TIMEOUT);
InputStream stream = connection.getInputStream();
int statusCode = connection.getResponseCode();
if (statusCode != HttpStatus.OK.value()) {connection.disconnect();throw new RuntimeException("Document editing service returned status: " + statusCode);
}
if (stream == null) {connection.disconnect();throw new RuntimeException("Input stream is null");
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = stream.read(data, 0, data.length)) != -1) {buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();

3. 使用List.of()

Java 9引入了List.of()等集合工厂方法。在Java 8中,可以使用Arrays.asList()或者手动创建并添加元素。

原Java 11代码:

public List<Template> createTemplates(final String fileName) {List<Template> templates = List.of(new Template("", "Blank", documentManager.getCreateUrl(fileName, false)),new Template(getTemplateImageUrl(fileName), "With sample content", documentManager.getCreateUrl(fileName, true)));return templates;
}

转换为Java 8的代码:

public List<Template> createTemplates(final String fileName) {List<Template> templates = new ArrayList<>();templates.add(new Template("", "Blank", documentManager.getCreateUrl(fileName, false)));templates.add(new Template(getTemplateImageUrl(fileName), "With sample content", documentManager.getCreateUrl(fileName, true)));return templates;
}

4. var 关键字

Java 11引入了局部变量类型推断(Local-Variable Type Inference),即 var 关键字。Java 8中没有这个特性,因此需要将所有使用 var 的地方替换为明确的类型声明。

Java 11 示例:

var list = new ArrayList<String>();
var stream = Files.newInputStream(path);

转换为Java 8:

ArrayList<String> list = new ArrayList<>();
InputStream stream = Files.newInputStream(path);

5. 新的字符串方法

Java 11为String类引入了多个新方法,如isBlank(), lines(), strip(), repeat()等。这些在Java 8中都不可用,需要手动实现或用其他方式替换。

Java 11 示例:

var result = " Test ".strip();  // 移除首尾空格
var count = "Hello".repeat(3);  // 重复字符串

转换为Java 8:

String result = " Test ".trim();  // 使用trim()方法移除首尾空白
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) sb.append("Hello");
String count = sb.toString();

6. 文件操作的新方法

Java 11增强了FilesPath类的功能,比如Path.of()Files.readString(), Files.writeString()等方法。Java 8中需要用旧的方法来实现相同的功能。

Java 11 示例:

var path = Path.of("data.txt");
var content = Files.readString(path);
Files.writeString(path, "Example");

转换为Java 8:

Path path = Paths.get("data.txt");
byte[] bytes = Files.readAllBytes(path);
String content = new String(bytes, StandardCharsets.UTF_8);
Files.write(path, "Example".getBytes(StandardCharsets.UTF_8));

7. Lambda 表达式的增强

Java 11 在 lambda 表达式的局部变量上允许使用 var 关键字,使得可以在lambda表达式中为参数显式声明类型注解。Java 8 支持 lambda 表达式,但不支持在其中使用 var

Java 11 示例:

(BinaryOperator<Integer>) (var x, var y) -> x + y;

转换为Java 8:

(BinaryOperator<Integer>) (Integer x, Integer y) -> x + y;

8. Optional 的增强

Java 11 引入了 Optional.isEmpty() 方法,以提供对 Optional 对象是否为空的更直观的检查。Java 8 中并没有这个方法,可以通过 !Optional.isPresent() 来替代。

Java 11 示例:

Optional<String> optional = Optional.of("test");
boolean isEmpty = optional.isEmpty();

转换为Java 8:

Optional<String> optional = Optional.of("test");
boolean isEmpty = !optional.isPresent();

9. try-with-resources 的改进

Java 9 优化了 try-with-resources 语句,使得可以在 try 语句中直接使用之前已经声明的变量。Java 8 要求资源必须在 try 语句内声明。

Java 11 示例:

BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
try (reader) {return reader.readLine();
}

转换为Java 8:

try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {return reader.readLine();
}

10. HTTP Client API

Java 11 引入了全新的 HTTP Client API 以支持 HTTP/2. Java 8 中没有这样的API,通常需要使用 HttpURLConnection 或引入第三方库如 Apache HttpClient。

Java 11 示例:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://example.com")).build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

转换为Java 8:

URL url = new URL("http://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
InputStream inputStream = connection.getInputStream();
String response = new BufferedReader(new InputStreamReader(inputStream)).lines().collect(Collectors.joining("\n"));

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

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

相关文章

Spring Bean的线程安全问题

对于Proptotype&#xff08;原型&#xff09;作用域 普通成员变量是否线程安全。 安全 静态变量线程是否安全。 不安全 对于singletion&#xff08;单例&#xff09;作用域 普通成员变量是否线程安全。 不安全 静态变量线程是否安全。 不安全 如何解决 对于单例模式&…

WordPress MasterStudy LMS插件 SQL注入漏洞复现(CVE-2024-1512)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin MasterStudy LMS 3.2.5 版本及之…

java项目之在线课程管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线课程管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 在线课程管理系统的主要…

Nginx配置/.well-known/pki-validation/

当你需要在Nginx上配置.well-known/pki-validation/时&#xff0c;这通常是为了支持SSL证书的自动续订或其他验证目的。以下是配置步骤&#xff1a; 创建目录结构&#xff1a; 在你的网站根目录下创建一个名为.well-known的目录&#xff08;SSL证书申请之如何创建/.well-known/…

Linux环境Redis部署

Redis部署 Redis是一个高性能的开源键值存储系统&#xff0c;它主要基于内存操作&#xff0c;但也支持数据的持久化。与其他数据库相比&#xff0c;Redis的主要优势在于它的高性能、丰富的数据结构和原生的持久化能力。Redis不仅提供了类似的功能&#xff0c;还增加了持久化和…

如何实现本地缓存

什么是本地缓存 本地缓存是一种数据存储技术&#xff0c;它将数据暂时存储在本地的物理内存&#xff08;如RAM&#xff09;或者其他快速访问的存储介质中&#xff0c;以便快速检索&#xff0c;减少对远程数据源&#xff08;如数据库或外部API&#xff09;的访问需求。这种技术能…

[初阶数据结构】单链表

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL。 &#x1f4da;本文收录于初阶数据结构系列&#xff0c;本专栏主要是针对时间、空间复杂度&#xff0c;顺序表和链表、栈和队列、二叉树以及各类排序算法&#xff0c;持…

Java基础(23)三次握手和四次挥手

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。为确保数据的可靠传输&#xff0c;TCP使用了一系列的控制机制&#xff0c;包括三次握手和四次挥手。这些机制确保了连接的建立、数据…

如何使用client-go构建pod web shell

代码示例及原理 原理是利用websocket协议实现对pod的exec登录&#xff0c;利用client-go构造与远程apiserver的长连接&#xff0c;将对pod容器的输入和pod容器的输出重定向到我们的io方法中&#xff0c;从而实现浏览器端的虚拟终端的效果消息体结构如下 type Connection stru…

Meta更低的训练成本取得更好的性能: 多token预测(Multi-Token Prediction)

Meta提出了一种透过多token预测(Multi-token Prediction)来训练更好、更快的大型语言模型的方法。这篇论文的重点如下: 训练语言模型同时预测多个未来的token,可以提高样本效率(sample efficiency)。 在推论阶段,使用多token预测可以达到最高3倍的加速。 论文的主要贡献包括: …

Django中如何使用WebSocket实时更新数据?

在Django中使用WebSocket实时更新数据&#xff0c;可以通过使用第三方库Django Channels实现。Django Channels是基于WebSocket的实时通信框架&#xff0c;它使得Django应用可以处理实时的、异步的任务。 下面是使用Django Channels实时更新数据的一般步骤&#xff1a; 安装D…

ES集群数据备份与迁移

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、文章涉及概念讲解二、操作步骤1.创建 snapshot repository操作主机hadoop1分别操作从机hadoop2和hadoop3 2. 查看仓库信息3. 备份索引&#xff0c;生成快照…

【S32K UDS BootLoader】-1.1-Unified bootloader Demo和ECUBus工具的使用

<--返回「Autosar_MCAL高阶配置」专栏主页--> 目录 1 下载S32K1/S32K3/S12Z Unified bootloader Demo 1.1 在S32DS中编译S32K312_CAN_bootloader_RTD2d0工程并烧录 2 ECUBus工具使用 2.1 PCAN环境搭建 1.1.1 安装PCAN驱动 1.1.2 安装PCAN-View 2.2 下载并安装ECU…

蓝桥杯 BASIC-26 基础练习 报时助手

蓝桥杯 BASIC-26 基础练习 报时助手 问题描述 给定当前的时间&#xff0c;请用英文的读法将它读出来。 时间用时h和分m表示&#xff0c;在英文的读法中&#xff0c;读一个时间的方法是&#xff1a; 如果m为0&#xff0c;则将时读出来&#xff0c;然后加上“o’clock”&#xff…

嵌入式C语言的变量和函数存储类型

目录 概述 1 嵌入式C的数据类型 2 嵌入式C语言存储类型 2.1 auto存储类型 2.2 extern存储类型 2.3 register存储类型 2.4 static存储类型 概述 本文主要介绍嵌入式C语言中的数据变量的类型&#xff0c;包括其数据长度&#xff0c;在内存中的存储方式。还介绍了数据的存储…

C语言 | Leetcode C语言题解之第77题组合

题目&#xff1a; 题解&#xff1a; int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int* temp malloc(sizeof(int) * (k 1));int tempSize 0;int** ans malloc(sizeof(int*) * 200001);int ansSize 0;// 初始化// 将 temp 中 [0, k - 1] 每个…

Vue项目中使用echarts教程

Vue项目中使用echarts教程 步骤npm 安装ECharts引入 ECharts老版本引入方式 &#xff08;v4版本&#xff09;新版本引入方式 &#xff08;v5版本&#xff09; ECharts初体验ECharts组件化&#xff08;进阶写法&#xff09; 步骤 npm 安装ECharts npm install echarts --save引…

回答篇:测试开发高频面试题目

引用之前文章&#xff1a;《测试开发高频面试题目》 https://blog.csdn.net/qq_41214208/article/details/138193469?spm1001.2014.3001.5502 本篇文章是回答篇&#xff08;持续更新中&#xff09; 1. 什么是测试开发以及其在软件开发流程中的作用。 a. 测试开发是指测试人员或…

关于Anaconda常用的命令

常用命令 查看当前环境下的环境&#xff1a;conda env list查看当前conda的版本&#xff1b;conda --version conda create -n your_env_name pythonX.X&#xff08;2.7、3.6等)命令创建python版本为X.X。名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装…

收银系统源码--什么是千呼智慧新零售系统?

千呼智慧新零售系统是一套针对零售行业线上线下一体化收银系统。给门店提供线下称重收银、o2o线上商城、erp进销存、精细化会员管理、丰富营销插件等一体化解决方案。多端数据打通&#xff0c;实现线上线下一体化&#xff0c;提升门店工作效率&#xff0c;实现数字化升级&#…