自己总结优化代码写法
jdk1.7新特性详解
开发期间略知jdk1.7的一些特性,没有真正的一个一个得展开研究,而是需要说明再去查,导致最整个新特性不是特别的清楚,这种情况以后得需要改变了,否则就会变成代码的奴隶。现在正好有时间可以细细的研究研究了。文章主要参照oracle jdk1.7的官方地址:https://docs.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7
- jdk17新特性详解
- 二进制字面量
- 在数字字面量使用下划线
- switch可以使用string了
- 实例创建的类型推断
- 使用Varargs方法使用不可维护的形式参数时改进了编译器警告和错误
- try-with-resources 资源的自动管理
- 捕捉多个异常类型和对重新抛出异常的高级类型检查
try-with-resources 资源的自动管理
try-with-resources 声明是try 一个或多个资源的声明。一个资源作为一个对象在程序结束之后必须关闭它。try-with-resources声明保证每一个资源都会被关闭在声明结束的时候。任何实现了java.lang.AutoCloseable接口或者实现了java.io.Closeable,可以作为一个资源。
下面的例子从文件中读取第一行。用到了BufferedReader得实例去从文件中读取数据。BufferedReader是一个资源,在程序完成之后必须关闭。
static String readFirstLineFromFile(String path) throws IOException {try (BufferedReader br = new BufferedReader(new FileReader(path))) {return br.readLine();}
}
在这个例子中,在try-with-resources语句中声明的资源是BufferedReader。声明语句出现在try关键字后面的括号内。BufferedReaderJava SE 7及更高版本中的类实现了接口java.lang.AutoCloseable。由于BufferedReader实例是在try-with-resource语句中声明的,因此无论try语句是正常还是意外完成(由于方法BufferedReader.readLine抛出IOException),它都将被关闭。
在Java SE 7之前,无论try语句是正常还是意外完成,都可以使用finally块来确保资源已关闭。以下示例使用finally代替try-with-resources语句的块:
static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {BufferedReader br = new BufferedReader(new FileReader(path));try {return br.readLine();} finally {if (br != null) br.close();}
}
然而,在这个例子中,如果方法readLine和close都抛出异常,方法readFirstLineFromFileWithFinallyBlock则抛出由finally块抛出的异常,由try块排除的异常将会被抑制。相反,在例子readFirstLineFromFile中,如果try块和try-with-resources声明都抛出异常,方法readFirstLineFromFile则抛出由try块抛出的异常,由try-with-resources抛出的异常将会被抑制。
您可以在try-with-resources语句中声明一个或多个资源。以下示例将检索打包在zip文件zipFileName中的文件的名称,并创建一个包含这些文件名称的文本文件:
public static void writeToFileZipFileContents(String zipFileName, String outputFileName)throws java.io.IOException {java.nio.charset.Charset charset = java.nio.charset.Charset.forName("US-ASCII");java.nio.file.Path outputFilePath = java.nio.file.Paths.get(outputFileName);// Open zip file and create output file with try-with-resources statementtry (java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)) {// Enumerate each entryfor (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {// Get the entry name and write it to the output fileString newLine = System.getProperty("line.separator");String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;writer.write(zipEntryName, 0, zipEntryName.length());}}}
在此示例中,try-with-resources语句包含两个用分号分隔的声明:ZipFile和BufferedWrite。当直接跟随它的代码块正常结束或由于异常而终止时,close这些BufferedWriter和ZipFile对象的方法将按此顺序自动调用。请注意,close资源的方法是按照与创建相反的顺序来调用的。
捕捉多个异常类型和对重新抛出异常的高级类型检查
处理大于一种类型的异常
在JAVA SE 7 以及以后的版本中,一个简单的catch块可以处理大于一种类型的异常。这个功能可以减少代码重复并且减少了对捕获广泛异常的诱惑。
注意下面的例子,每一个catch块都包含重复代码
catch (IOException ex) {logger.log(ex);throw ex;
catch (SQLException ex) {logger.log(ex);throw ex;
}
在Java SE 7以前的版本中,创建一个通用的方法来消除重复的代码是很困难的,因为变量ex有不同的类型。
以下示例在Java SE 7及更高版本中有效,可消除重复的代码:
catch (IOException|SQLException ex) {logger.log(ex);throw ex;
}
该catch子句指定类型的块处理异常的,以及每个异常类型与竖线分割(|)。
注意:如果一个catch块处理多个异常类型,则该catch参数是隐式的final。在这个例子中,这个catch参数ex是final,所以你不能在这个catch块中赋值。
一个catch块处理多个异常编译生成的字节码要比多个catch块且每个只处理一个异常生成的字节码要小的多,并且优化。一个catch块处理多个异常的代码块通过编译器生成的字节码代码不重复,字节码没有对异常处理程序的复制。
JDK8
1、Lambda 演变过程
2、StreamAPI 详解
3、Date
StreamAPI 详解

功能
父类:BasicStream
子类:Stream、IntStream、LongStream、DoubleStream
包含两个类型,中间操作 (intermediate operations) 和结束操作 (terminal operations)
下面是所有方法的属于那一端操作的方法:

//1.将集合转换成流list.stream();//2.forEach 遍历list.forEach(System.out::println);//3.filter过滤list.stream().filter((e) -> e.getStar().equals("天秤座")).forEach(System.out::println);Optional<Student> optionalStudent = list.stream().filter((e) -> e.getStar().equals("天秤座")).findAny();Student student = optionalStudent.get();//4.map 转换集合List<String> names = list.stream().map(Student::getName).collect(Collectors.toList());names.stream().forEach(System.out::println);Map<String, Object> map = new HashMap<>();map.put("key1","1");map.put("key2","1");map.put("key3","1");map.put("key4","1");List<String> cidList = map.keySet().stream().map(String::toString).collect(Collectors.toList()); System.out.println(cidList);//5.mapToInt 转换数值流IntStream intStream = list.stream().mapToInt(Student::getAge);Stream<Integer> integerStream = intStream.boxed();Optional<Integer> max = integerStream.max(Integer::compareTo);System.out.println(max.get());//6.flatMap 合并成一个流List<String> list2 = new ArrayList<>();list2.add("aaa bbb ccc");list2.add("ddd eee fff");list2.add("ggg hhh iii");list2.add("ggg hhh iii");list2 = list2.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(Collectors.toList());System.out.println(list2);//7.distinct 去重list2.stream().distinct().forEach(System.out::println)//复杂去重
// List<RedPacketRecord> newList = records.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(RedPacketRecord::getRoomId))), ArrayList::new));//8、sorted 排序//asc排序list.stream().sorted(Comparator.comparingInt(Student::getAge)).forEach(System.out::println);System.out.println("------------------------------------------------------------------");//desc排序list.stream().sorted(Comparator.comparingInt(Student::getAge).reversed()).forEach(System.out::println);//9、skip 跳过前 n 个list.stream().skip(1).forEach(System.out::println);//10、limit 截取前 n 个list.stream().limit(1).forEach(System.out::println);//11、anyMatchboolean isHave = list.stream().anyMatch(student2 -> student2.getAge() == 16);System.out.println(isHave);//12、allMatchboolean isHave2= list.stream().allMatch(student2 -> student2.getAge() == 16);System.out.println(isHave2);//13、noneMatchboolean isHave3 = list.stream().noneMatch(student2 -> student2.getAge() == 16);System.out.println(isHave3);//14、findAnyOptional<Student> student = list.stream().findAny();System.out.println(student.get());//15、findFirstOptional<Student> student = list.stream().findFirst();System.out.println(student.get());//17、count 计数long count = list.stream().count();System.out.println(count);//18、ofStream<String> stringStream = Stream.of("i","love","you");//19、emptyStream<String> stringStream2 = Stream.empty();//20、iterateList<String> list = Arrays.asList("a", "b", "c", "c", "d", "f", "a");Stream.iterate(0, i -> i + 1).limit(list.size()).forEach(i -> {System.out.println(String.valueOf(i) + list.get(i));});//21、collect:averagingLong// 求年龄平均值Collector<Student, ?, Double> studentDoubleCollector = Collectors.averagingLong(Student::getAge);Double average = list.stream().collect(studentDoubleCollector);//22、collect:collectingAndThen// 求年龄平均值String average2 = list.stream().collect(Collectors.collectingAndThen(Collectors.averagingInt(Student::getAge), a->"哈哈,平均年龄"+a));System.out.println(average2);//23、collect:counting// 求数量Long num = list.stream().collect(Collectors.counting());System.out.println(num);//24、collect: groupingBy(Function)Map<Integer,List<Student>> result = list.stream().collect(Collectors.groupingBy(Student::getAge));for (Integer age:result.keySet()){System.out.println(result.get(age));}//25、collect:groupingBy(Function,Collector)// 先分组,在计算每组的个数Map<Integer,Long> num = list.stream().collect(Collectors.groupingBy(Student::getAge,Collectors.counting()));System.out.println(num);//26、collect:groupingBy(Function, Supplier, Collector)// 先分组,在计算每组的个数,然后排序Map<Integer,Long> num = list.stream().collect(Collectors.groupingBy(Student::getAge, TreeMap::new,Collectors.counting()));System.out.println(num);//27、collect:groupingByConcurrent
// 同上,不过这个 Concurrent 是并发的,也有 3 个方法,和上面非并发一个效果
// groupingByConcurrent(Function)
// groupingByConcurrent(Function, Collector)
// groupingByConcurrent(Function, Supplier, Collector)//28、collect:joining()// 名字拼接String result3 = list.stream().map(Student::getName).collect(Collectors.joining());System.out.println(result3);//29、collect:joining(str)// 名字拼接,用逗号隔开String result4 = list.stream().map(Student::getName).collect(Collectors.joining(","));System.out.println(result4);//30、collect:joining(str, prefix, suffix)// 名字拼接,包含前缀、后缀String result5 = list.stream().map(Student::getName).collect(Collectors.joining(",","hello","world"));System.out.println(result5);//31、collect:summarizingDouble// 求年龄的最大值、最小值、平均值、综合以及人数DoubleSummaryStatistics result6 = list.stream().collect(Collectors.summarizingDouble(Student::getAge));System.out.println(result6);//32、collect:toCollection
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;/*** @ClassName Student* @Author: c-wangjz02* @Description:*/
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Student {//名字private String name;//性别private String sex;//薪水private int salary;//年龄private int age;//星座private String star;
}
相关文章:
自己总结优化代码写法
jdk1.7新特性详解 开发期间略知jdk1.7的一些特性,没有真正的一个一个得展开研究,而是需要说明再去查,导致最整个新特性不是特别的清楚,这种情况以后得需要改变了,否则就会变成代码的奴隶。现在正好有时间可以细细的研…...
Java体系最强干货分享—挑战40天准备Java面试,最快拿到offer!
如何准备java面试,顺利上岸大厂java岗位? 主攻Java的人越来越多,导致行业越来越卷,最开始敲个“hello world”都能进大厂,现在,八股、全家桶、算法等等面试题横行,卷到极致!就拿今年…...
云计算|OpenStack|错误记录和解决方案(不定时更新)
前言: openstack的部署和使用是难度比较大的,难免会出现各种各样的问题,因此,本文将把一些在部署和使用openstack社区版时出现的错误做一个记录,并就每一个错误分析和解决问题。(尽量记录比较经典的错误&a…...
项目实战-NewFixedThreadPool线程池
目录 什么是线程池 线程池的类型 1.CachedThreadPool 2.FixedThreadPool 3.ScheduledThreadPool 4.SingleThreadPool 5.newWorkStealingPool 线程池的好处 1、线程池的重用 2、控制线程池的并发数 3、线程池可以对线程进行管理 线程池的示例 1.Client启动类 2.具体…...
导数与微分总复习——“高等数学”
各位CSDN的uu们你们好呀,今天,小雅兰来复习一下之前学过的知识点,也就是导数与微分的总复习,依旧是高等数学的内容,主要是明天就要考高等数学了,哈哈哈,下面,让我们一起进入高等数学…...
Linux软件安装
1.Linux安装JDK 1.安装位置 /opt 2.安装包 jdk-8u171-linux-x64.rpm 3.安装步骤 1.将安装包上传到虚拟机中 [rootlocalhost opt]# ls jdk-8u171-linux-x64.rpm2.执行安装命令 [rootlocalhost opt]# rpm -ivh jdk-8u171-linux-x64.rpm 准备中... #####…...
【表面缺陷检测】基于YOLOX的PCB表面缺陷检测(全网最详细的YOLOX保姆级教程)
写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 Hello,大家好,我是augustqi。 今天给大家分享一个表面缺陷检测项目:基于YOLOX的PCB表面缺陷检测(保姆级教程)。多的…...
【C#基础】C# 程序基础语法解析
序号系列文章0【C#基础】初识编程语言C#1【C#基础】C# 程序通用结构总结 文章目录前言基础语法1. using 关键字2. namespace 关键字3. class 关键字4. 成员字段5. 成员方法6. Main 方法7. new 关键字8. 标识符9. 关键字结语前言 😄 大家好,我是writer桑&…...
【webpack】webpack 中的插件安装与使用
一、webpack 插件的作用 通过安装和配置第三方的插件,可以拓展 webpack 的能力,从而让 webpack 用起来更方便。最常用的 的webpack 插件有如下两个: 1.webpack-dev-server(实时打包构建) 类似于 node.js 阶段用到的 no…...
生物素-磺基-活性酯,Sulfo-NHS Biotin科研用试剂简介;CAS:119616-38-5
生物素-磺基-活性酯,Sulfo-NHS Biotin 结构式: 编辑 添加图片注释,不超过 140 字(可选) 英文名称:Sulfo-NHS-Biotin Sulfosuccinimidyl biotin 中文名称:磺酸基-Biotin-N-琥珀酰亚胺基酯 CAS&…...
Debain安装命令
目录 一、安装sudo命令 二、安装jdk8 三、更换软件源 四、Debian 安装 yum 五、安装zip、unzip、curl、lrzsz、NUMA 六、安装Maven 五、问题 一、安装sudo命令 1)执行sudo命令,提示 -bash: sudo: command not found的解决方法 apt-get install s…...
2023-02-10 - 6 聚合
当用户使用搜索引擎完成搜索后,在展示结果中需要进行进一步的筛选,而筛选的维度需要根据当前的搜索结果进行汇总,这就用到了聚合技术。聚合的需求在很多应用程序中都有所体现,例如在京东App中搜索“咸鸭蛋”,然后单击搜…...
Servlet实现表白墙
目录 一、表白墙简介 二、代码实现 1、约定前后端交互的接口 2、后端代码实现 3、前端代码实现 三、效果演示 一、表白墙简介 在表白墙页面中包含三个文本框,分别表示表白者,表白对象,表白内容,在文本框中输入内容之后&…...
[python入门㊸] - python测试函数
目录 ❤ 测试函数 ❤ 单元测试和测试用例 ❤ 可通过的测试 ❤ 不能通过的测试 ❤ 测试未通过时怎么办 ❤ 添加新测试 ❤ 测试函数 学习测试,得有测试的代码。下面是一个简单的函数: name_function.py def get_formatted_name(first, last):…...
通讯录文件操作化
宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重…...
为什么 Web3 社交将超越其 Web2 同行
我们最近听到了很多关于 web3 社交媒体平台的消息。但如果你没有跟上,你可能想知道为什么我们已经有了 Twitter、Facebook、Instagram 等,我们还需要 web3 社交。好吧,这一切都取决于谁拥有权力。 在 web2 中,权力掌握在寻求收入最…...
当资深程序员深夜去“打劫”会发生什么?——打家劫舍详解
文章目录一、前言二、概述三、打家劫舍第一晚四、打家劫舍第二晚五、打家劫舍第三晚......一、前言 大家好久不见,正如标题所示,今天我不打算聊一些枯燥的算法理论,我们来聊一聊程序员有多厉害! 注意!!&am…...
linux 线程
文章目录1、线程的概念1.1、进程 vs 线程1.2、线程的种类2、线程的控制2.1、线程的创建2.2、线程的退出2.3、线程的取消2.4、线程的等待2.5、线程的分离2.5、线程清理函数线程清理函数响应的时机线程清理函数不响应的时机3、线程的同步和互斥3.1、锁机制3.1.1、锁的类型3.1.2、…...
Windows 安装appium环境
1 windows Appium环境 1.1 安装Node.js Node.js的安装相对简单,下载安装包安装(安装包node-v19.6.0-x64.msi), nodejs 安装 然后一路狂点下一步就可以了 安装完成后,在终端中输入node -v,显示版本号则表示安装成功 node-v16.13.1 1.2 JDK安装及环境变…...
为什么要在电子产品中使用光耦合器?
介绍 光耦合器不仅可以保护敏感电路,还可以使工程师设计各种硬件应用。光耦合器通过保护元件,可以避免更换元件的大量成本。然而,光耦合器比保险丝更复杂。光耦合器还可以通过光耦合器连接和断开两个电路,从而方便地控制两个电路…...
5分钟掌握猫抓浏览器扩展:免费视频下载和媒体嗅探终极指南
5分钟掌握猫抓浏览器扩展:免费视频下载和媒体嗅探终极指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(cat-catch)是一款专业的…...
国际B2B企业平台表达框架:IBM式重构与ServiceNow式统一执行
如果把国际B2B品牌表达看成一个系统问题,IBM / ServiceNow这组样本可以拆成一套判断框架。它不是讨论文案怎么写,而是讨论输入什么业务条件,输出什么品牌角色、结构和证据链。框架结论:IBM与ServiceNow都服务企业转型,…...
一次断电引发的血案:深度复盘CentOS 7 LVM分区下fstab丢失的排查与修复全记录
CentOS 7 LVM环境下fstab丢失的深度修复指南 当服务器遭遇意外断电时,文件系统损坏往往是最令人头疼的问题之一。最近处理的一起CentOS 7系统宕机案例,由于断电导致/etc/fstab文件丢失,系统无法正常启动。本文将详细记录整个排查和修复过程&a…...
HBM高带宽内存:从立体堆叠到2.5D封装的性能革命
1. 从平面到立体:HBM如何重塑内存性能天花板在半导体行业里,我们常把“摩尔定律”挂在嘴边,仿佛性能提升的唯一路径就是晶体管越做越小。但大约十年前,当工艺微缩的红利开始放缓,功耗墙和信号完整性问题日益严峻时&…...
2026 年 5 月 CERT 发布 dnsmasq 六个严重安全漏洞,2.93 版本或一周左右发布
消息基本信息西蒙凯利在 2026 年 5 月 11 日,周一,协调世界时 17:18:25 发布消息,上一条消息(按线程)是[[Dnsmasq 讨论组] DHCP 请求中电路 ID 匹配问题],下一条消息(按线程)是[[Dns…...
IC测试插座技术解析与市场应用实践
1. 行业背景与奖项意义解析在电子制造领域,互连产品如同精密仪器中的"神经末梢",承担着信号传输与能量供给的关键职能。IC测试插座和老化插座作为其中的核心组件,其性能直接影响半导体器件从研发验证到批量生产的全流程可靠性。这类…...
AI智能体开发实战:从框架选型到部署优化的全流程指南
1. 项目概述与核心价值最近在探索AI智能体(AI Agent)和自动化工作流领域时,我反复被一个名字刷屏:AwesomeClaw。这个由CrayBotAGI团队开源的项目,在GitHub上迅速获得了大量关注。乍一看,它像是一个又一个“…...
CAN 总线技术综合研究报告
CAN总线技术综合研究报告 报告日期: 2026年5月14日 引言 在当今高度信息化和自动化的世界中,设备内部以及设备之间的可靠通信是实现复杂功能的基石。从汽车的动力控制到工厂的自动化生产线,都需要一个高效、可靠的通信网络来协调各个控制单元的工作。控制器局域网(Contr…...
从电视测试卡到EDA工具:电子设计自动化的演进与内核
1. 项目概述:从测试卡到EDA,一段技术演进的个人叙事前几天整理旧物,翻出一张泛黄的老照片,是我小时候和堂姐蹲在黑白电视机前的合影。背景里,电视屏幕上不是动画片,而是那个著名的BBC测试卡图案——一个穿着…...
高效AI教材写作指南:借助AI工具,低查重完成40万字教材编写!
教材编写中的原创性与合规性问题及 AI 工具解决方案 在教材编写的过程中,如何平衡原创性与合规性是一个不可忽视的重要问题。在借鉴优秀教材中的内容时,创作者不可避免地会担心作品的查重率过高;而在尝试自行创作知识点时,又可能…...
