Java 8升级Java 11,升级必知要点!竟然有这些坑…

随着技术的不断进步,Java作为一种广泛使用的编程语言,其版本更新带来了许多新特性和性能提升。从Java 8升级到Java 11,是一个重要的转变,它不仅带来了新的编程范式,还引入了对现代软件开发的多项优化。然而,在享受这些新特性的同时,开发者也可能遇到一些升级过程中的“坑”。

本文,已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

本文将详细介绍从Java 8升级到Java 11的要点,包括9个实用技巧及其详细的代码示例。

技巧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");// 遍历listfor (var element : list) {System.out.println(element); // 打印元素}}
}

注释:在这个示例中,使用var声明的listelement变量,使代码更加简洁易读。

技巧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的isBlankstriplines方法,用于更高效地处理字符串。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 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));}
}

注释:这段代码展示了如何使用OptionalifPresentOrElsemap方法来处理可空对象,使得代码更加健壮和易于维护。

技巧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类的writeStringreadString方法,实现了文件的简单读写操作,大大简化了文件操作的代码。

技巧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());// 尝试修改列表将抛出UnsupportedOperationExceptiontry {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")); // trueSystem.out.println(emailPredicate.test("invalid-email")); // false}
}

注释:这段代码利用了Pattern的**asMatchPredicate()**方法,方便地创建了一个用于验证邮箱格式的谓词。

技巧9:使用流的新方法dropWhile和takeWhile

Java 11在Stream接口中添加了dropWhiletakeWhile方法,用于更灵活地处理流。

示例代码:

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 4System.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则舍弃符合条件的元素,直到遇到第一个不符合条件的元素。这两个方法在处理有序流时非常有用。

Java 11 相比于Java 8的主要改进和新增功能:

1、使用var关键字简化局部变量的类型声明:通过var实现类型推断,简化代码编写。

2、利用新的String API:增强的String类,引入了如isBlankstriplines等实用方法。

3、使用新的HTTP Client API:支持HTTP/2和WebSocket,简化了HTTP请求和响应的处理。

4、使用Optional的新方法:例如ifPresentOrElsemap,增强了对可空对象的处理。

5、使用新的文件读写APIFiles类的writeStringreadString方法,简化了文件操作。

6、Lambda表达式的局部变量语法:支持在Lambda表达式中使用var关键字,提高了代码的清晰度。

7、使用Collectors.toUnmodifiableList() :创建不可修改的集合,增强了集合的不变性和安全性。

8、使用Pattern的asMatchPredicate() :将正则表达式模式转换为谓词,简化了文本匹配操作。

9、使用流的新方法dropWhile和takeWhile:为流处理提供了更灵活的操作,便于处理有序集合。

项目文档&视频:

开源:项目文档 & 视频 Github-Doc

总结

这些例子展示了Java 11如何在提高代码效率、简化语法、增强功能和改善开发体验方面的进步。

通过使用这些新工具和API,开发者可以以更少的代码实现更复杂的功能,同时提高代码的可读性和健壮性。了解并应用这些技巧,将有助于在从Java 8升级到Java 11的过程中,避免常见的陷阱,充分利用Java 11带来的好处。

本文,已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

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

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

相关文章

Redis分布式锁(二)基于Redis的分布式锁

一、redis锁 1、思路 利用set nx ex获取锁&#xff0c;并设置过期时间&#xff0c;保存线程标识释放锁时先判断线程标识是否与自己一致&#xff0c;一致则删除 2、特性 利用set nx满足互斥性利用set ex保证故障时锁依然能释放&#xff0c;避免死锁&#xff0c;提高安全性利…

.net6解除文件上传限制。Multipart body length limit 16384 exceeded

在C#中上传文件时如果不修改默认文件的上传大小会提示Multipart body length limit 16384 exceeded这个错误提示表明你的请求中的Multipart body长度超过了16384字节的限制。这通常意味着你正在尝试发送一个太大的请求体&#xff0c;可能是因为包含了太多数据或者太大的文件。要…

29道memcached面试题含答案(很全)

点击下载《29道memcached面试题含答案&#xff08;很全&#xff09;》 1. Memcached是什么&#xff0c;有什么作用&#xff1f; Memcached是一个开源的&#xff0c;高性能的内存缓存软件&#xff0c;从名称上看Mem就是内存的意思&#xff0c;而Cache就是缓存的意思。Memcache…

如何进行深入的竞品分析:掌握这些技巧让你更加了解市场

随着互联网行业的快速发展&#xff0c;产品经理需要对竞品进行深入分析&#xff0c;才能更好地把握市场需求和趋势&#xff0c;为公司带来更好的商业价值。那么&#xff0c;如何做好竞品分析呢&#xff1f;以下是我对于这个问题的思考和建议。 一、确定分析的目的和范围 在开…

vs 修改系统环境变量putenv、_putenv

事情起因是某一天需要在vs2010的工程中去动态配置adb环境变量&#xff0c;win10环境 一开始&#xff0c;使用了putenv&#xff0c;很快进入代码调试&#xff0c;死活无法达成目的&#xff08;奇怪的是另外一个工程就能修改成功&#xff09; 一番面向运气编程&#xff0c;最后…

3D Gaussian Splatting 应用场景及最新进展【附10篇前沿论文和代码】

CV玩家们&#xff0c;知道3D高斯吗&#xff1f;对&#xff0c;就是计算机视觉最近的新宠&#xff0c;在几个月内席卷三维视觉和SLAM领域的3D高斯。不太了解也没关系&#xff0c;我今天就来和同学们一起聊聊这个话题。 3D Gaussian Splatting&#xff08;3DGS&#xff09;是用于…

vue项目中px单位转rem插件

一、安装插件&#xff1a; "postcss-px2rem": "^0.3.0", "postcss-px2rem-exclude": "0.0.6",二、新建postcss.config.js module.exports {plugins: {autoprefixer: {},"postcss-px2rem-exclude": {"remUnit":…

前端会造成内存泄漏的操作有哪些?页面卡住的原因

如果你发现前端页面卡住了&#xff0c;打开开发者工具也很卡&#xff0c;刷新页面也无效、或者关闭 tab页也很费劲&#xff0c;多半是有内存泄漏。 内存泄漏其实就是浏览器的内存被占用很多&#xff0c;导致页面奔溃。 以下是一些常见的引起内存泄漏的操作&#xff1a; 未正确…

ShardingSphere-JDBC学习笔记

引言 开源产品的小故事 Sharding-JDBC是2015年开源的&#xff0c;早期的定位就是一个分布式数据库的中间件&#xff0c;而在它之前有一个MyCat的产品。MyCat也是从阿里开源出来的&#xff0c;作为分库分表的代名词火了很长一段时间&#xff0c;而MyCat早年的目标就是想进入ap…

一致性 Hash

一致性 Hash 一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法&#xff0c;常用于负载均衡。Memcached client 也选择这种算法&#xff0c;解决将 key-value 均匀分配到众多 Memcached server 上的问题。它可以取代传统的取模操作&#xff0c;解决了取模操作无法…

关于网盘下载速度提升的一些技巧!!

这里写自定义目录标题 前言&#xff1a;步骤&#xff1a;一、下载IDM二、安装油猴三、添加到Google拓展程序上PS&#xff1a;四、添加脚本五、IDM配置六、打开网页版网盘 前言&#xff1a; 18G的网盘资源下载时间仅仅3-5分钟 步骤&#xff1a; 一、下载IDM 这里我以IDM举例…

kettle分页抽取数据

背景 kettle抽取数据大家还是比较熟悉的&#xff0c;kettle在抽取数据的时候会开启很多通道&#xff0c;同时抽取&#xff0c;但是我现在遇到一个场景&#xff1a; 从一个mysql数据库里获取“已办”状态的数据id&#xff0c;然后拿这些id去一个oracle数据库里查询&#xff0c…

BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【2】

这是本系列文章中的第二弹,假设你已经读过了前文。先来简单回顾一下BERT的想法: 1)在Word2Vec【1】中,每个单词生成的Embedding是固定的。但这就带来了一个显而易见的问题:同一个单词在不同上下文中的意思是不同的。例如mouse,可以是鼠标的意思,也可以是老鼠的意思。但…

【MATLAB】ICEEMDAN_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 ICEEMDAN-LSTM神经网络时序预测算法是一种结合了改进的完全扩展经验模态分解&#xff08;ICEEMDAN&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 …

【UE Niagara学习笔记】02 - 制作燃烧的火焰

目录 效果 步骤 一、添加资产 二、制作材质 三、制作粒子 3.1 循环播放 3.2 粒子生成的数量 3.3 粒子的生命周期和初始大小 3.4 火焰高度 3.5 火焰范围 3.6 火焰颜色 效果 步骤 一、添加资产 1. 在虚幻商城中搜索“M5 VFX Vol2. Fire and Flames(Niagara)”…

遇见狂神说 Spring MVC 学习笔记(完整笔记+代码)

MVC架构介绍 MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范MVC是将业务逻辑、数据、显示分离的方式来组织代码MVC主要作用是降低了视图与业务逻辑间的双向偶合MVC不是一种设计模式&#xff0c;是一种架构模式。当然不同的MVC存在差异…

python 文件

open """ def open(file: FileDescriptorOrPath, //路径mode: OpenTextMode "r", //设置打开文件的模式 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 w 打开一个文件只用写入。如果该文件已存在则打开文件&#…

CodeWave智能开发平台--03--目标:应用创建--07供应商数据表格02

摘要 本文是网易数帆CodeWave智能开发平台系列的第10篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成07供应商数据表格下 CodeWave智能开发平台的10次接触 CodeWave参考资源 网易数帆CodeWave开发…

Docker简述与基础部署详解

docker官网&#xff1a;https://www.docker.com docker中文库:https://www.docker.org.cn/ Docker是一种开源的容器化平台&#xff0c;用于轻松打包、交付和运行应用程序。Docker的主要优势在于它提供了一种轻量级、可移植、自包含的容器化技术&#xff0c;使得应用程序及其所…

智能手表喇叭无气孔导致老化播放后没声音

智能音箱喇叭老化播放后没声音 智能手表要做防水&#xff0c;在外壳上打了防水胶&#xff0c;结果出现播放突然没声音的现象&#xff0e; 原因 一直播放&#xff0c;设备温度升高&#xff0c;因为做了防水密闭导致喇叭腔体气压异常&#xff0c;导致播放没声音&#xff0e; …