首页 > 编程语言 >Java SE 16 新增特性

Java SE 16 新增特性

时间:2022-08-21 23:12:54浏览次数:172  
标签:java 16 Java import public SE

Java SE 16 新增特性

作者:Grey

原文地址:Java SE 16 新增特性

源码

源仓库: Github:java_new_features

镜像仓库: 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:[email protected]">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:[email protected]">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

更多:JDK 16 DateTimeFormatter

Stream.toList()

详见:JDK-8180352

其目的是减少一些常用的流收集器的模板代码,如Collectors.toListCollectors.toSet

示例代码如下

package git.snippets.jdk16;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author <a href="mailto:[email protected]">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 平台下为debrpm格式

MacOS 平台下为pkgdmg格式

Windows 平台下为msiexe格式

命令格式为:

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:[email protected]">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:[email protected]">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 SE 7及以后各版本新增特性

参考资料

JDK 16 Release Notes

New Features in Java 16

Java 16 Update: What’s New In JDK 16

Java 16 新功能介绍

标签:java,16,Java,import,public,SE
From: https://www.cnblogs.com/greyzeng/p/16611353.html

相关文章

  • Java注解
    1.注解入门1.1Annotation位于源码中(代码/注释/注解),使用其他工具进行处理的标签注解用来修饰程序的元素,但不会对被修饰的对象有直接的影响只有通过某种配套的工具才......
  • Java基础练习题-错题集(一)
    (1)下面代码输出结果是?classC{C(){System.out.print("C");}}classA{Cc=newC();A(){this("A");System.o......
  • Elasticsearch基本操作
    索引操作创建索引PUT/user查询指定索引GET/user查询所有索引信息GET_cat/indices?v删除索引DELETE/user类型映射自动映射elasticsearch默认情况下会自......
  • Elasticsearch Java client使用
    前言Elasticsearch官方列出了好几个客户端,如下所示JavaClientJavaRestClient(JavaHighLevelRESTClient)JavaTransportClient其中JavaRestClient在7.15.0被......
  • Elasticsearch 实战
    需求假设现在有这么一个需求,系统接了很多的报文,需要提供全文检索,为了简化,报文目前只有类型,流水号,内容这三个字段。索引设计建立msg索引,映射规则如下PUT/msg{ "mappi......
  • 《Java周边》IDEA操作说明
    1. setting设置1.1设置字体大小:1.2设置文件层级1.3编码设置 设置默认值:1.4设置注释模板1.5属性断点1.6异常断点1.7条件断点1.8调试(强制调用......
  • useEffect用来监听组件间通信——订阅发布失效
    1.在做这个图书订阅管理系统时,遇到一个这样的业务逻辑:就是这样的逻辑::点击设置---》选择书籍---》点击提交按钮--》轮播图展示这是订阅的代码,没有啥问题,页面挂载的......
  • Java八股文纯享版——目录
    《Java八股文纯享版——篇①:Java基础》《Java八股文纯享版——篇②:并发编程》《Java八股文纯享版——篇③:JVM》《Java八股文纯享版——篇④:数据库》《Java八股文纯享......
  • Elasticsearch学习环境搭建
    Elasticsearch安装官方文档下载windows7.17.5版本安装包,安装包是一个zip,和tomcat一样解压即可用,elasticsearch依赖JDK环境,至少需要JDK1.8版本。运行#进入bin目录......
  • Java时间格式:yyyy-mm-dd转换为yyyy年mm月dd日
    Java时间格式:yyyy-mm-dd转换为yyyy年mm月dd日1:sql直接操作SELECTDATE_FORMAT(‘2022-01-04’,’%Y年%m月%d日’)--结果就是:2022年01月04日122:java格式化操作......