Java 11 到 Java 8 的兼容性转换

news2024/11/20 8:48:34

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.coloradmin.cn/o/1655111.html

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

相关文章

从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践

作者&#xff1a;武基鹏&#xff0c;无锡锡商银行 大数据技术经理 编辑整理&#xff1a;SelectDB 技术团队 导读&#xff1a;为实现数据资产的价值转化以及全面数字化、智能化的风险管理&#xff0c;无锡锡商银行大数据平台经历从 Hive 离线数据仓库到 Apache Doris 实时数据仓…

ifconfig命令找不到 command not found

问题 今天解决虚拟机的网络问题后&#xff0c;使用ifconfig发现报错命令未找到 解决方案 输入yum install ifconfi的程序安装包 yum install ifconfig 如果显示没有可用软件包 ifconfig&#xff0c;错误&#xff1a;。 就输入yum search ifconfig匹配安装包程序 yum searc…

数仓开发,分层(ods,dw,app层)

1、从数据源中导入源数据&#xff0c;到ODS表&#xff0c;作为事实表的数据 2、可以根据自己的开发设计&#xff0c;是否单独分支出来一个维度表&#xff0c;帮助和协助处理源数据表ODS层 和需求层ADS&#xff08;APP&#xff09;层 3、现在我们有了一个事实ODS层&#xff0…

力扣每日一题119:杨辉三角||

题目 简单 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出…

基于SSM的“小型企业人事管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“小型企业人事管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 登录界面 个人信息页面 用户打卡页面 扣…

C++贪心算法

关于string的系统函数&#xff01; &#xff08;注&#xff1a;以下函数只可用于string&#xff0c;不适用其他类型的变量&#xff09; ① a.size(); 这个系统函数是用来获取这个string变量的长度的&#xff0c;我们通常会新建一个变量来保存他&#xff0c;以便之后使用。 …

跨协议通讯无缝对接:Modbus-BACnet楼宇智能转换器深度解析

在现代化的建筑群里&#xff0c;智能楼宇管理系统如同神经系统&#xff0c;协调着各设备的运行。某大型商业综合体&#xff0c;集购物中心、办公区、酒店于一体&#xff0c;面对着来自不同供应商的设备&#xff0c;如何实现统一管理和高效通讯成了首要挑战。特别是其内部既有采…

区块链 | NFT 水印:Review on Watermarking Techniques(一)

&#x1f34d;原文&#xff1a;Review on Watermarking Techniques Aiming Authentication of Digital Image Artistic Works Minted as NFTs into Blockchains 1 应用于 NFT 的水印技术 常见的水印技术类型可以分为&#xff1a; 可见 v i s i b l e \mathsf{visible} visi…

STM32快速入门(串口传输之USART)

STM32快速入门&#xff08;串口传输之USART&#xff09; 前言 USART串口传输能实现信息在设备之间的点对点传输&#xff0c;支持单工、半双工、全全双工&#xff0c;一般是有三个引脚&#xff1a;TX、RX、SW_RX&#xff08;共地&#xff09;。不需要一根线来同步时钟。最大优…

C++ list介绍(迭代器失效)

一、常用接口 reverse逆置 sort排序&#xff08;默认升序&#xff09; 仿函数greater<int> merge合并&#xff0c;可以全部合并&#xff0c;也可以一部分合并 unique&#xff1a;去重&#xff08;先排序&#xff0c;再去重&#xff09; remove&#xff1a;删除e值&#…

Hive SQL Join连接操作用法详解

Hive SQL Join连接操作 1.Hive join语法规则 基本语法&#xff1a; SELECT column_list FROM table1 JOIN table2 ON table1.column_name table2.column_name;JOIN类型&#xff1a; 在JOIN语句中&#xff0c;你可以使用不同类型的JOIN操作&#xff0c;包括INNER JOIN、LEFT O…

水面垃圾清理机器人的视觉算法研究

卷积神经网络是一种分层的数据表示模型&#xff0c;通常由数据输入层、卷积层、池化层、 非线性激活函数、全连接层以及输出结果预测层等组成&#xff0c;其中卷积层、池化层和非线 性激活函数是卷积神经网络中的重要组成部分。此外&#xff0c;有些模型会增加其他的层(归一 化…

C#贪吃蛇

C#贪吃蛇 文章目录 Program.csText1Game.csISceneUpdate.csText2BeginScene.csBegionOrEndScene.csEndScene.csGameScene.csText3GameObject.csIDraw.csPosition.csText4Food.csSnakeBody.csWall.csText5Map.csText6Snake.csProgram.cs using 贪吃蛇.Text1;Game game = new Ga…

pinia持久化出现store和storage的数据不一致的问题

问题描述 突然发现menu的store异常&#xff0c;pinia中查看到store数据正确&#xff0c;但是localstorage中的数据始终没有同步&#xff0c;但user的store没问题&#xff0c;具体如下&#xff1a; menu的store&#xff1a; user的store&#xff1a; 问题原因 进入系统…

[嵌入式系统-72]:RT-Thread-组件:单元测试框架utest

目录 utest 测试框架 ​编辑 测试用例定义 测试单元定义 utest 应用框图 2. utest API assert 宏 测试单元函数运行宏 测试用例导出宏 测试用例 LOG 输出接口 3. 配置使能 4. 应用范式 5. 测试用例运行要求 6. 运行测试用例 测试结果分析 7. 测试用例运行流程 …

mysql中varchar与bigint直接比较会导致精度丢失以至于匹配到多行数据

在mysql中&#xff0c;我们都知道如果一个索引字段使用了函数或者计算那么查询的时候索引会失效&#xff0c;可是我相信在联表的时候我们只会关注两个表关联字段是否都创建了索引&#xff0c;却没有关注过这两个字段的类型是否一致&#xff0c;如果不一致的话索引是会失效的&am…

uni-app实战在线教育类app开发

随着移动互联网的快速发展&#xff0c;教育行业也在不断向在线化、数字化方向转型。开发一款功能丰富、用户体验优秀的在线教育类 App 对于满足学习者需求、促进教育行业的发展至关重要。本文将介绍如何利用 Uni-App 进行在线教育类 App 的开发&#xff0c;让您快速上手&#x…

Python 全栈体系【四阶】(三十九)

第五章 深度学习 八、目标检测 3. 目标检测模型 3.2 YOLO 系列 3.2.4 YOLOv4&#xff08;2020 年 4 月&#xff09; YOLOv4 将最近几年 CV 界大量的研究成果集中在一套模型中&#xff0c;从检测速度、精度、定位准确率上有了明显改善&#xff08;相对于 YOLOv3&#xff0c…

前端项目加载离线的百度地图,利用工具进行切指定区域的地图影像,自定义图层getTilesUrl

百度地图在开发中我们经常使用&#xff0c;但是有些项目是需要在内网进行&#xff0c;这时候我们不得不考虑项目中一些功能需要请求外网静态资源&#xff0c;比如百度地图。只有把包下载到本地&#xff0c;才能让静态资源文件的正常的访问。 目录 获取百度地图开发秘钥 引入在…

yolov8任务之目标检测

对象检测 对象检测是一项涉及识别图像或视频流中对象的位置和类别的任务。对象检测器的输出是一组包围图像中对象的边界框&#xff0c;以及每个框的类标签和置信度分数。当您需要识别场景中感兴趣的对象&#xff0c;但不需要确切知道对象在哪里或其确切形状时&#xff0c;对象检…