0
点赞
收藏
分享

微信扫一扫

uniapp实现内嵌其他网页的功能

半夜放水 2024-06-16 阅读 30

JDK版本升级的非常快,现在已经到JDK20了。JDK版本虽多,但应用最广泛的还得是JDK8,正所谓“他发任他发,我用Java8”。

但实际情况却不是这样,越来越多的java工程师拥抱 JDK17,于是了解了一下 JDK17新语法,感觉确实香啊,推荐大家一起试一下!

  • 长期支持版本
    JDK17是Oracle于2021年9月14日发布的一个长期支持版本(LTS)。它将获得长期的更新和支持,帮助保持程序的稳定性和可靠性。

  • 性能提升
    经过综合评估,我们发现在从Java 8升级到Java 11后,G1GC的平均速度提升了16.1%,ParallelGC则提升了4.5%。当从Java 11升级到Java 17时,G1GC的平均速度提升了8.66%,而ParallelGC则提升了6.54%。这些结果是基于对OptaPlanner用例的基准测试得出的。总的来说,这些优
    化让垃圾回收器更加优秀。
    最大的亮点是带来了稳定版的ZGC垃圾回收器,达到亚毫秒级停顿。

  • 新语法和特性
    Switch表达式简化、Text Blocks文本块、instanceof的模式匹配升级和NullPointerException提示信息改进等
    支持最新的技术和框架
    Spring framework6 和Spring Boot3 都默认使用 Java 17作为最低版本

  • 压测结果
    JDK17相对于JDK8和JDK11,所有垃圾回收器的性能都有很明显的提升,特别是稳定版的ZGC垃圾回收器。不论任何机器配置下,都推荐使用ZGC,ZGC的停顿时间达到亚毫秒级,吞吐量也比较高

一、JDK17 新语法

1. 文本块

推荐指数:⭐️⭐️⭐️⭐️⭐️

原来的写法

/**
 * 使用JDK8返回HTML文本
 *
 * @return 返回HTML文本
 */
public static final String getHtmlJDK8() {
    return "<html>\n" +
        " <body>\n" +
        " <p>Hello, world</p>\n" +
        " </body>\n" +
        "</html>";
}

新的写法

/**
 * 使用JDK17返回HTML文本
 *
 * @return 返回HTML文本
 */
public static final String getHtmlJDK17() {
    return """
        <html>
            <body>
                <p>Hello, world</p>
            </body>
        </html>
        """;
}

2. NullPointerException增强

推荐指数:⭐️⭐️⭐️⭐️⭐️

public static void main(String[] args) {
    try {
        //简单的空指针
        String str = null;
        str.length();
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        //复杂一点的空指针
        var arr = List.of(null);
        String str = (String)arr.get(0);
        str.length();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

运行结果

3. Records

推荐指数:⭐️⭐️⭐️⭐️

package com.summo.jdk17;

/**
 *
 * @param stuId     学生ID
 * @param stuName   学生名称
 * @param stuAge    学生年龄
 * @param stuGender 学生性别
 * @param stuEmail  学生邮箱
 */
public record StudentRecord(Long stuId,
                            String stuName,
                            int stuAge,
                            String stuGender,
                            String stuEmail) {
    public StudentRecord {
        System.out.println("构造函数");
    }

    public static void main(String[] args) {
        StudentRecord record = new StudentRecord(1L, "张三", 16, "男", "xxx@qq.com");
        System.out.println(record);
    }
}

4. 全新的switch表达式

推荐指数:⭐️⭐️⭐️

package com.summo.jdk17;

public class SwitchDemo {
    /**
     * 在JDK8中获取switch返回值方式
     *
     * @param week
     * @return
     */
    public int getByJDK8(Week week) {
        int i = 0;
        switch (week) {
            case MONDAY, TUESDAY:
                i = 1;
                break;
            case WEDNESDAY:
                i = 3;
                break;
            case THURSDAY:
                i = 4;
                break;
            case FRIDAY:
                i = 5;
                break;
            case SATURDAY:
                i = 6;
                break;
            case SUNDAY:
                i = 7;
                break;
            default:
                i = 0;
                break;
        }

        return i;
    }

    /**
     * 在JDK17中获取switch返回值
     *
     * @param week
     * @return
     */
    public int getByJDK17(Week week) {
        // 1, 现在的switch变成了表达式,可以返回值了,而且支持yield和->符号来返回值
        // 2, 再也不用担心漏写了break,而导致出问题了
        // 3, case后面支持写多个条件
        return switch (week) {
            case null -> -1;
            case MONDAY -> 1;
            case TUESDAY -> 2;
            case WEDNESDAY -> 3;
            case THURSDAY -> {yield 4;}
            case FRIDAY -> 5;
            case SATURDAY, SUNDAY -> 6;
            default -> 0;
        };
    }

    private enum Week {
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY
    }
}

5. 私有接口方法

推荐指数:⭐️⭐️⭐️

public interface PrivateInterfaceMethod {
    /**
     * 接口默认方法
     */
    default void defaultMethod() {
        privateMethod();
    }

    // 接口私有方法,在Java8里面是不被允许的,不信你试试
    private void privateMethod() {
    }
}

6. 模式匹配

推荐指数:⭐️⭐️⭐️⭐️

原来的写法

/**
 * 旧式写法
 *
 * @param value
 */
public void matchByJDK8(Object value) {
    if (value instanceof String) {
        String v = (String)value;
        System.out.println("遇到一个String类型" + v.toUpperCase());
    } else if (value instanceof Integer) {
        Integer v = (Integer)value;
    System.out.println("遇到一个整型类型" + v.longValue());
    }
}

新的写法

/**
 * 转换并申请了一个新的变量,极大地方便了代码的编写
 *
 * @param value
 */
public void matchByJDK17(Object value) {
    if (value instanceof String v) {
        System.out.println("遇到一个String类型" + v.toUpperCase());
    } else if (value instanceof Integer v) {
        System.out.println("遇到一个整型类型" + v.longValue());
    }
}

7. 集合类的工厂方法

推荐指数:⭐️⭐️⭐️⭐️⭐️

原来的写法

Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c"

新的写法

Set<String> set = Set.of("a", "b", "c");

二、其他的新特性

1. 新的String方法

  • repeat:重复生成字符串
  • isBlank:不用在引入第三方库就可以实现字符串判空了
  • strip:去除字符串两边的空格,支持全角和半角,之前的trim只支持半角
  • lines:能根据一段字符串中的终止符提取出行为单位的流
  • indent:给字符串做缩进,接受一个int型的输入
  • transform:接受一个转换函数,实现字符串的转换

2. Stream API的增强

// takeWhile 顺序返回符合条件的值,直到条件不符合时即终止继续判断,
// 此外toList方法的加入,也大大减少了节省了代码量,免去了调用collect(Collectors::toList)方法了
List<Integer> list = Stream.of(2,2,3,4,5,6,7,8,9,10)
        .takeWhile(i->(i%2==0)).toList(); // 返回2, 2

// dropWhile 顺序去掉符合条件的值,直到条件不符合时即终止继续判断
List<Integer> list1 = Stream.of(2,2,3,4,5,6,7,8,9,10)
        .dropWhile(i->(i%2==0)).toList(); //返回3, 4, 5, 6, 7, 8, 9, 10

// ofNullable,支持传入空流,若没有这个且传入一个空流,那么将会抛NPE
var nullStreamCount = Stream.ofNullable(null).count(); //返回0

// 以下两行都将输出0到9
Stream.iterate(0, n -> n < 10, n -> n + 1).forEach(x -> System.out.println(x));
Stream.iterate(0, n -> n + 1).limit(10).forEach(x -> System.out.println(x));

3. 全新的HttpClient

// 同步请求
HttpClient client = HttpClient.newBuilder()
        .version(Version.HTTP_1_1)
        .followRedirects(Redirect.NORMAL)
        .connectTimeout(Duration.ofSeconds(20))
        .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
        .authenticator(Authenticator.getDefault())
        .build();
   HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
   System.out.println(response.statusCode());
   System.out.println(response.body()); 
   
// 异步请求
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://foo.com/"))
        .timeout(Duration.ofMinutes(2))
        .header("Content-Type", "application/json")
        .POST(BodyPublishers.ofFile(Paths.get("file.json")))
        .build();
   client.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println);
 

4. JShell

5. java命令 直接执行 java文件

6. ZGC

小结:
随着Java8即将停止免费官方支持,越来越多的项目将转向Java17,包括大名鼎鼎的Spring Boot 3.0,它在2022年1月20日发布的第一个里程碑版本(M1)正是基于Java17构建的。
大多数情况下,从 JDK 8 升级到 JDK 17 是可行的,但需要对应用程序进行适当的测试和调整,以确保其在新版本上的稳定运行。
但是如果项目中其他成员使用了某些新特性,在Java8下将无法通过编译.,到时候再换就有点晚了

三、各版本 收费情况

JDK4 系列

Java 4.2.30 以后的所有版本

JDK5系列

Java 5.0.22 以后的所有版本

JDK6系列

Java 6.0.45以后的所有版本

JDK7系列

Java 7.0.80以后的所有版本

JDK8系列

Java 8.0.202以后的所有版本

JDK11~16系列

Java 11~16的所有版本

JDK17系列

Java 17 – 2024年12月以后所发布的所有版本

JDK21系列

预计到2027年JDK21也开始收费

举报

相关推荐

0 条评论