自己总结优化代码写法
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安装及环境变…...

为什么要在电子产品中使用光耦合器?
介绍 光耦合器不仅可以保护敏感电路,还可以使工程师设计各种硬件应用。光耦合器通过保护元件,可以避免更换元件的大量成本。然而,光耦合器比保险丝更复杂。光耦合器还可以通过光耦合器连接和断开两个电路,从而方便地控制两个电路…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...