Java9到17我关心的新特性

更像一篇笔记

只记录未来开发时可能用到的特性。 都2023年了,真正可能用的版本只有11和17,不关心特性到底在哪个中间版本脱离 preview 了。

#Java9

https://www.baeldung.com/new-java-9

  • 新的 HTTP client HttpClient HttpRequest HttpResponse builder 构造 HTTP 请求

  • Try-With-Resources 能 close 掉在 try 之前定义的 auto-closable 资源, 只要资源是 final or effectively final。 Effectively final means that the variable can’t be changed once it has been initialized. 不显式地加 final 也行,IDE 会提示的。

  • Interface Private Method 帮助分解复杂的 default 方法。

  • JShell is read–eval–print loop – REPL for short.不需要定义 Main 来测试代码片段了。

jshell> /save c:\develop\JShell_hello_world.txt
jshell> /open c:\develop\JShell_hello_world.txt
Hello JShell!
  • 用 jcmd 在不重启 JVM 的情况下修改 JVM 参数。

#Java10

https://www.baeldung.com/java-10-overview

** [List|Set|Map]copyOf() 是浅拷贝,里面是 DTO 的话不会调用 DTO 的 clone,不要用。

#Java11(Oracle JDK 转商用)(201809)

https://www.baeldung.com/java-11-new-features

  • Collection 转 array String[] sampleArray = sampleList.toArray(String[]::new);

  • Local-Variable Syntax for Lambda 用这个语法给 lambda 变量加注解

1
2
3
String resultString=sampleList.stream()
        .map((@Nonnull var x)->x.toUpperCase())
        .collect(Collectors.joining(", "));
  • nestmate 概念(不需要记) https://www.baeldung.com/java-nest-based-access-control 对程序员来说,有新的 Reflection API。 外部类和内部类互为 nestmate:外部类同时为外部类和内部类的 NestHost, 外部类和内部类互相加为 NestMembers.这样 JVM 能省点事。 nestmate 互相能在编码时读 private 成员,像以前一样。 以前用 Reflect API 不能读,现在能了。
1
Outer.class.getNestHost().getName()

#Java12(201903)

https://www.baeldung.com/java-12-new-features

  • String.transform() ,接受一个 Function 应用到字符串上,返回另一个字符串。
1
2
3
String transformed=text.transform(value->
        new StringBuilder(value).reverse().toString()
        );
  • Teeing Collector in Stream API, 接受两个 Collector 和一个 merge 函数,合并两 Collector 结果。
1
2
3
double mean=Stream.of(1,2,3,4,5)
        .collect(Collectors.teeing(Collectors.summingDouble(i->i),
        Collectors.counting(),(sum,count)->sum/count));
  • instanceof 后定义变量名
1
2
3
if(obj instanceof String s){
        int length=s.length();
        }

#Java13(201909)

https://www.baeldung.com/java-13-new-features

没有 release 出的值得注意的

#Java14(202003)

https://www.baeldung.com/java-14-new-features

  • Switch 语法函数式更新 执行可不返回值。若使用函数体{}且要返回值,要用 yield 而非 return
1
2
3
4
5
typeOfDay=switch(dayOfWeek){
        case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY->"Working Day";
        case SATURDAY,SUNDAY->"Day Off";
default ->throw new IllegalArgumentException("What's a "+day);
        };
  • Text Block 多行字符串 不需要转义双引号!所有 String 方法都支持。但有两个其他的转义:
    • \ to indicate the end of the line, so that a new line character is not introduced
    • \s to indicate a single space
1
2
3
4
5
6
String TEXT_BLOCK_JSON="""
{
"name" : "Baeldung",
"website" : "https://www.%s.com/"
}
""";
  • Records https://www.baeldung.com/java-record-keyword 全参数构造方法 override 有些奇怪,加上全参数会报错。 因为字段全是 final 所以不会有 Setter 方法,只生成 Getter。 适合定义只读的结构复杂些的常量。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public record Person(String name, String address) {
    public Person {
        Objects.requireNonNull(name);
        Objects.requireNonNull(address);
    }

    public Person(String name) {
        this(name, "Unknown");
    }
}
  • 更好的 NPE 位置报错

#Java15(202009)

https://www.baeldung.com/java-15-new

  • Sealed Classes 两个新关键字:sealed,permits 控制父类拥有有限的子类。 子类需声明为 sealed, final, non-sealednon-sealed是给扩展留的口子。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public abstract sealed class Person
        permits Employee, Manager {
    //...
}

public final class Employee extends Person {
}

public non-sealed class Manager extends Person {
}
  • Foreign Memory API 在 JVM Heap 之外操作 JVM 内存,不会被 GC,所以可以处理大段的内存。

#Java16(202103)

https://www.baeldung.com/java-16-new-features

  • 能用反射 API 调用接口的 default 方法了

  • Stream.collect(Collectors.toList()); 简化成 Stream.toList(),还有 toSet()。

#Java17(202109)

https://www.baeldung.com/java-17-new-features

Java17那个 preview 的 switch pattern matching 真香,能省掉不少 if-else-大括号,可惜在 preview。

updatedupdated2023-08-082023-08-08