Java 8升级Java 11,升级必知要点!竟然有这些坑…
随着技术的不断进步,Java作为一种广泛使用的编程语言,其版本更新带来了许多新特性和性能提升。从Java 8升级到Java 11,是一个重要的转变,它不仅带来了新的编程范式,还引入了对现代软件开发的多项优化。然而,在享受这些新特性的同时,开发者也可能遇到一些升级过程中的“坑”。
本文将详细介绍从Java 8升级到Java 11的要点,包括9个实用技巧及其详细的代码示例。
本文,已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享
技巧1:使用var关键字简化局部变量的类型声明
Java 11引入了局部变量类型推断,即通过var关键字,编译器可以自动推断变量的类型。
示例代码:
import java.util.ArrayList;
public class VarExample {
public static void main(String[] args) {
// 使用var声明变量,编译器自动推断类型
var list = new ArrayList<String>();
list.add("Java");
list.add("Python");
// 遍历list
for (var element : list) {
System.out.println(element); // 打印元素
}
}
}
注释:在这个示例中,使用var声明的list和element变量,使代码更加简洁易读。
技巧2:利用新的String API
Java 11加强了String类,引入了多个新的实用方法。
示例代码:
public class StringExample {
public static void main(String[] args) {
String multilineString = "Hello\nJava 11\nWorld";
// 判断字符串是否为空白
System.out.println("Is blank: " + multilineString.isBlank());
// 去除首尾空白
System.out.println("Trimmed: " + multilineString.strip());
// 行分割
multilineString.lines().forEach(System.out::println);
}
}
注释:这里演示了Java 11中String的isBlank、strip和lines方法,用于更高效地处理字符串。
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
技巧3:使用新的HTTP Client API
Java 11引入了一个新的HTTP Client API,支持HTTP/2协议和WebSocket。
示例代码:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://www.example.com"))
.build();
// 发送请求并获取响应
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
}
}
注释:这个示例展示了如何使用Java 11的新HTTP Client API发送一个简单的HTTP请求并处理响应。
技巧4:使用Optional的新方法
Java 11增强了Optional类,提供了更多实用的方法来处理可空对象。
示例代码:
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optionalString = Optional.of("Java 11");
// 如果值存在,则执行给定的操作,否则不执行
optionalString.ifPresentOrElse(
value -> System.out.println("Value: " + value),
() -> System.out.println("Value is not present")
);
// 转换Optional中的值
Optional<Integer> length = optionalString.map(String::length);
System.out.println("String length: " + length.orElse(0));
}
}
注释:这段代码展示了如何使用Optional的ifPresentOrElse和map方法来处理可空对象,使得代码更加健壮和易于维护。
技巧5:使用新的文件读写API
Java 11为Files类引入了更简洁的读写文件的API。
示例代码:
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
public class FileReadWriteExample {
public static void main(String[] args) throws Exception {
Path path = Path.of("example.txt");
// 写入文件
Files.writeString(path, "Hello Java 11\n");
// 读取文件
String content = Files.readString(path);
System.out.println("File content: " + content);
}
}
注释:这段代码利用Java 11中Files类的writeString和readString方法,实现了文件的简单读写操作,大大简化了文件操作的代码。
技巧6:Lambda表达式的局部变量语法
Java 11允许在Lambda表达式中使用局部变量的语法,这使得代码更加清晰。
示例代码:
import java.util.function.Consumer;
public class LambdaVarExample {
public static void main(String[] args) {
Consumer<String> printer = (var message) -> System.out.println("Message: " + message);
printer.accept("Java 11 supports local variable syntax in lambda.");
}
}
注释:在这个例子中,printer这个Lambda表达式接受一个字符串类型的参数message,使用了var关键字来声明。这提高了代码的可读性,并且使Lambda表达式的类型处理更加灵活。
技巧7:使用Collectors.toUnmodifiableList()
Java 11加强了Collectors类,提供了创建不可修改集合的方法,例如toUnmodifiableList()。
示例代码:
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class UnmodifiableListExample {
public static void main(String[] args) {
List<String> list = Stream.of("Java", "Python", "C++")
.collect(Collectors.toUnmodifiableList());
// 尝试修改列表将抛出UnsupportedOperationException
try {
list.add("JavaScript");
} catch (UnsupportedOperationException e) {
System.out.println("Cannot modify the list");
}
// 打印不可变列表
list.forEach(System.out::println);
}
}
注释:这段代码展示了如何创建一个不可修改的列表,这在创建只读数据集时非常有用,提高了代码的安全性。
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
技巧8:使用Pattern的asMatchPredicate()
Java 11为Pattern类引入了asMatchPredicate()方法,它可以将正则表达式模式转换为Predicate。
示例代码:
import java.util.function.Predicate;
import java.util.regex.Pattern;
public class PatternMatchPredicateExample {
public static void main(String[] args) {
Predicate<String> emailPredicate =
Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$")
.asMatchPredicate();
// 测试字符串是否符合邮箱格式
System.out.println(emailPredicate.test("user@example.com")); // true
System.out.println(emailPredicate.test("invalid-email")); // false
}
}
注释:这段代码利用了Pattern的asMatchPredicate()方法,方便地创建了一个用于验证邮箱格式的谓词。
技巧9:使用流的新方法dropWhile和takeWhile
Java 11在Stream接口中添加了dropWhile和takeWhile方法,用于更灵活地处理流。
示例代码:
import java.util.stream.Stream;
public class StreamDropTakeWhileExample {
public static void main(String[] args) {
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
.takeWhile(n -> n < 5) // 获取小于5的元素
.forEach(n -> System.out.print(n + " ")); // 输出1 2 3 4
System.out.println();
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
.dropWhile(n -> n < 5) // 舍弃小于5的元素
.forEach(n -> System.out.print(n + " ")); // 输出5 6 7 8 9
}
}
注释:takeWhile方法在遇到第一个不符合条件的元素时停止处理,而dropWhile则舍弃符合条件的元素,直到遇到第一个不符合条件的元素。这两个方法在处理有序流时非常有用。
技巧10:项目文档&视频:
Java 11 相比于Java 8的主要改进和新增功能:
1、使用var关键字简化局部变量的类型声明:通过var实现类型推断,简化代码编写。
2、利用新的String API:增强的String类,引入了如isBlank、strip、lines等实用方法。
3、使用新的HTTP Client API:支持HTTP/2和WebSocket,简化了HTTP请求和响应的处理。
4、使用Optional的新方法:例如ifPresentOrElse和map,增强了对可空对象的处理。
5、使用新的文件读写API:Files类的writeString和readString方法,简化了文件操作。
6、Lambda表达式的局部变量语法:支持在Lambda表达式中使用var关键字,提高了代码的清晰度。
7、使用Collectors.toUnmodifiableList() :创建不可修改的集合,增强了集合的不变性和安全性。
8、使用Pattern的asMatchPredicate() :将正则表达式模式转换为谓词,简化了文本匹配操作。
9、使用流的新方法dropWhile和takeWhile:为流处理提供了更灵活的操作,便于处理有序集合。
总结
这些例子展示了Java 11如何在提高代码效率、简化语法、增强功能和改善开发体验方面的进步。
通过使用这些新工具和API,开发者可以以更少的代码实现更复杂的功能,同时提高代码的可读性和健壮性。了解并应用这些技巧,将有助于在从Java 8升级到Java 11的过程中,避免常见的陷阱,充分利用Java 11带来的好处。
本文,已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享
Java 8升级Java 11,升级必知要点!竟然有这些坑…的更多相关文章
- 图解 & 深入浅出Java初始化与清理:构造器必知必会
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- jQuery必知要点(一)
1. jQuery框架的显著特点. jQuery强调的理念是写的少,做的多(write less.do more). 其主要特点有:轻量级.强大的选择器.美丽的DOM操作封装.可靠的事件处理机制.完好 ...
- 第5节:Java基础 - 必知必会(下)
第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...
- 必知必会之Java注解
必知必会之Java注解 目录 不定期更新中-- 元注解 @Documented @Indexed @Retention @Target 常用注解 @Deprecated @FunctionalInte ...
- 必知必会之 Java
必知必会之 Java 目录 不定期更新中-- 基础知识 数据计量单位 面向对象三大特性 基础数据类型 注释格式 访问修饰符 运算符 算数运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 三目表达式 ...
- Java面试必知必会(扩展)——Java基础
float f=3.4;是否正确? 不正确 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失: 因此需要强制类型转换: 方式一:float f=(float)3.4 方式二:float ...
- Java面试必知必会:基础
面试考察的知识点多而杂,要完全掌握需要花费大量的时间和精力.但是面试中经常被问到的知识点却没有多少,你完全可以用 20% 的时间去掌握 80% 常问的知识点. 一.基础 包括: 杂七杂八 面向对象 数 ...
- java学习一目了然——异常必知
java学习一目了然--异常必知 我们只要学java,异常肯定非常熟悉,该抛的时候抛一下就行.但是这其中还有点小细节需要注意.就用这个小短篇来说一下异常处理中的小细节吧. 异常处理 RuntimeEx ...
- Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题
Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题 原文地址:https://m.oschina.net/question/737237_2203576 现在容器用的是tomcat,做维 ...
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...
随机推荐
- 小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务
小米作为全球知名的科技巨头公司,已经在数百款产品中广泛应用了 AI 技术,这些产品包括手机.电视.智能音箱.儿童手表和翻译机等.这些 AI 应用主要都是通过小米的深度学习训练平台完成的. 在训练平台的 ...
- JS深入学习笔记 - 第三章.变量作用域与内存
1.原始值和引用值 ECMScript变量包含两种不同类型是数据:原始值和引用值. 原始值:最简单的数据.有6中原始值:Undefined.Null.Boolean.Number.String和Sym ...
- 工作中常用的一些Git骚操作,一般人我不告诉他。
一.Git提交代码 1 git pull 从服务器上拉取代码 2 git status 查看文件的状态 3 git add . 添加所有文件到暂存区 4 git commit -m "提交的 ...
- WPF 中引入依赖注入(.NET 通用主机)
WPF 中引入依赖注入(.NET 通用主机) 在网上看到的文章都是通过 App.cs 中修改配置进行的,这样侵入性很高而且服务主机是通过 App 启动时加载的而不是服务主机加载的 App 有一点违反原 ...
- go mod tidy总是安装最新依赖,如何查找哪个模块导致某个包安装最新依赖,提供一个小工具
安装: go install github.com/jan-bar/interesting/findModVer@latest 执行:findModVer d:\myproject 结果如下图所示: ...
- 关于 React 性能优化和数栈产品中的实践
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:的卢 引入 在日常开发过程中,我们会使用很多性能优化的 A ...
- 一分钟了解 ChatGPT 语音对话
一.背景 近期 ChatGPT 推出新的语音和图像功能,可以与用户进行语音对话或基于用户上传的图像进行分析和对话,提供了一种新的.更直观的交互体验.用户可以更轻松地表达自己的需求.提出问题,并获得 C ...
- Unity csc.rsp文件
试验版本 Unity2020.3 编译符号,就是#if UNITY_ANDROID这个东西,在处理多平台多分支的情况下挺有用的,但是在ProjectSettings里面设置比较麻烦,不主动代码调用保存 ...
- QT中级(1)QTableView自定义委托(一)实现QSpinBox、QDoubleSpinBox委托
1 写在前面的话 我们在之前写的<QT(7)-初识委托>文章末尾提到,"使用一个类继承QStyledItemDelegate实现常用的控件委托,在使用时可以直接调用接口,灵活实现 ...
- Node.js如何处理多个请求?
Node.js如何处理多个请求? 前言 在计算机科学领域,关于并发和并行的概念经常被提及.然而,这两个术语常常被混为一谈,导致很多人对它们的理解存在着很多混淆.本文小编将通过对并发和并行的深入解析,帮 ...