Java SE 16 新增特性
Java SE 16 新增特性
作者:Grey
原文地址:Java SE 16 新增特性
源码
镜像仓库: GitCode:java_new_features
使用反射执行接口中的默认实现方法
作为对接口中默认方法的增强,随着 Java SE 16 的发布,java.lang.reflect.InvocationHandler可以通过使用反射调用接口的默认方法。
详见:JDK-8159746
参考如下示例
package git.snippets.jdk16;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import static java.lang.ClassLoader.getSystemClassLoader;
/**
* 反射调用接口的默认方法
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/8/21
* @since 16
*/
public class InvocationEnhance {
public static void main(String[] args) throws Exception {
invoke();
}
static void invoke() throws Exception {
Object proxy = Proxy.newProxyInstance(getSystemClassLoader(), new Class<?>[]{HelloWorld.class}, (prox, method, args) -> {
if (method.isDefault()) {
return InvocationHandler.invokeDefault(prox, method, args);
}
// ...
return prox;
});
Method method = proxy.getClass().getMethod("hello");
System.out.println(method.invoke(proxy).equals("world"));
}
}
interface HelloWorld {
default String hello() {
return "world";
}
}
运行输出true。
Sealed Classes 二次预览
Sealed Classes 是在Java SE 15中首次引入的,它提供了一种机制来确定哪些子类被允许扩展或实现父类或接口。在 Java SE 16 中, Sealed Classes 依然是预览状态。
Day Period Support
详见:JDK-8247781
DateTimeFormatter 的一个新成员是日周期符号 "B",它提供了一个上午/下午格式的替代方案。
如下代码:
package git.snippets.jdk16;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* 详见:https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/time/format/DateTimeFormatter.html
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/8/21
* @since 16
*/
public class DayPeriodTest {
public static void main(String[] args) {
LocalTime date = LocalTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("B h:m");
System.out.println(date.format(formatter));
}
}
输出下午 3:54
Stream.toList()
详见:JDK-8180352
其目的是减少一些常用的流收集器的模板代码,如Collectors.toList和Collectors.toSet。
示例代码如下
package git.snippets.jdk16;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/8/21
* @since 16
*/
public class StreamToListMethodDemo {
public static void main(String[] args) {
List<String> integersAsString = Arrays.asList("1", "2", "3");
// before jdk 16
List<Integer> ints = integersAsString.stream().map(Integer::parseInt).collect(Collectors.toList());
// jdk 16+
List<Integer> intsEquivalent = integersAsString.stream().map(Integer::parseInt).toList();
}
}
打包工具增强
使用 jpackage 命令可以把 JAR 包打包成不同操作系统支持的软件格式,
在 Java SE 14 中是预览功能,到Java SE 16中正式启用
常见平台格式如下:
Linux 平台下为deb和rpm格式
MacOS 平台下为pkg和dmg格式
Windows 平台下为msi和exe格式
命令格式为:
jpackage --name myapp --input lib --main-jar main.jar --main-class myapp.Main
要注意的是,jpackage 不支持交叉编译,也就是说在 windows 平台上是不能打包成 MacOS 或者 Linux 系统的软件格式的。
instanceof 模式匹配
在 Java SE 14 中开始作为预览功能,Java SE 16 中被正式启用
package git.snippets.jdk16;
import java.util.ArrayList;
import java.util.Arrays;
/**
* instanceof
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2021/11/29
* @since 16
*/
public class InstanceofInJdk16 {
public static void main(String[] args) {
Object o = new ArrayList<String>();
// jdk 16
if (o instanceof ArrayList list) {
list.add("a");
}
// before jdk 16
if (o instanceof ArrayList) {
ArrayList list = (ArrayList) o;
list.add("a");
}
}
}
Records
在 Java SE 15 开始作为预览功能,Java SE 16 正式启用,示例代码如下:
package git.snippets.jdk16;
/**
* Records功能
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2021/11/29
* @since 16
*/
public class RecordsInJava15 {
public static void main(String[] args) {
test();
}
// record 是一种全新的类型,它本质上是一个 final 类,
// 同时所有的属性都是 final 修饰,它会自动编译出 public get hashcode 、equals、toString 等方法,减少了代码编写量。
private static void test() {
Cat c1 = new Cat("tomcat", 1);
Cat c3 = new Cat("tomcat", 1);
Cat c2 = new Cat("jerry", 2);
System.out.println(c1);
System.out.println(c2);
System.out.println(c1 == c3);
}
}
record Cat(String name, Integer age) {
}
更多
参考资料
Java 16 Update: What’s New In JDK 16
Java SE 16 新增特性的更多相关文章
- Java SE 19 新增特性
Java SE 19 新增特性 作者:Grey 原文地址: 博客园:Java SE 19 新增特性 CSDN:Java SE 19 新增特性 源码 源仓库: Github:java_new_featu ...
- Java SE 14 新增特性
Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 15 新增特性
Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 17 新增特性
Java SE 17 新增特性 作者:Grey 原文地址:Java SE 17 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 8 新增特性
Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- Java SE 9 新增特性
Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- Java SE 10 新增特性
Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 11 新增特性
Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 12 新增特性
Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
随机推荐
- JAVA - 线程同步和线程调度的相关方法
JAVA - 线程同步和线程调度的相关方法 wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁:wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等 ...
- 清除 GitHub 历史记录的隐私信息
清理 github 敏感信息 有的时候我们在提交到github上的内容不小心含有敏感代码,比如密码,公司的服务器IP等.这个时候就要通过一些手段清除这些信息. GitHub官方方案比较码放,所以推荐使 ...
- flink处理延迟
flink处理延迟 flink主要是处理实时数据的,在处理实时数据的过程中,难免会遇到乱序的存在.以事件时间举例,先发生的事件后到处理算子.flink针对乱序数据的处理主要有三种方式: 拨慢水位线的生 ...
- canal的使用
一.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实 ...
- MySql查询日周月
常用计算日期的函数 日 date(日期) = CURDATE() 自然周 YEARWEEK(date_format(日期,'%Y-%m-%d') , 1) = YEARWEEK(now() , 1) ...
- Node.js精进(5)——HTTP
HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种获取网络资源(例如图像.HTML文档)的应用层协议,它是互联网数据通信的基础,由请求和响应构成. 在 Node ...
- 简单实现python接口自动化(一)
目的:excel中维护接口用例数据,通过python中requests库进行读取用例,并把运行结果与excel中的预期结果对比,最后把执行情况写入到excel中去. excel维护数据: 具体的接口名 ...
- Jenkins + maven + svn 自动部署项目
1.安装Jenkins sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins. ...
- PTA(BasicLevel)-1094 谷歌的招聘
一.问题定义 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址, 而前面的网址是一个 10 位素数,这个素数 ...
- springboot中的任务处理
springboot中的任务处理 一.异步任务 在开发中有时用户提交的数据,后台需要一定时间才能做出响应,此时用户在前台也不能在等待中,此时就应该先开启异步请求处理,利用多线程,先给前台反馈,后台另一 ...