String中新增的API

API

image.png

代码

  1. package com.dance;
  2. public class SpringApiTest {
  3. public static void main(String[] args) {
  4. isBlankTest();
  5. stripTest();
  6. stripTest2();
  7. repeatTest();
  8. linesCount();
  9. }
  10. /**
  11. * 判断字符串是否为空
  12. * \t \n 都属于空
  13. */
  14. public static void isBlankTest() {
  15. System.out.println(" \t \n ".isBlank());
  16. }
  17. /**
  18. * 去除字符串首尾空格
  19. * 为什么有了trim方法后,还要出strip呢
  20. * 因为在trim方法中,只能去除半角空白字符,全角的空白字符是去除不了的
  21. * 所以又除了strip方法,可以去除半角和全角的空白
  22. */
  23. public static void stripTest(){
  24. System.out.println(" 这是一个很寂寞的天,下着有些伤心的雨 \u3000".trim() + "!");
  25. System.out.println(" 这是一个很寂寞的天,下着有些伤心的雨 \u3000".strip() + "!");
  26. }
  27. /**
  28. * stripTrailing : 去除尾部空格
  29. * stripLeading : 去除首部空格
  30. */
  31. public static void stripTest2(){
  32. System.out.println(" flower ".stripTrailing() + "!");
  33. System.out.println(" flower ".stripLeading() + "!");
  34. }
  35. /**
  36. * 重复, 返回一个新的String
  37. */
  38. public static void repeatTest(){
  39. System.out.println("123".repeat(3));
  40. }
  41. /**
  42. * 统计行数
  43. * \n \r 都是换行
  44. */
  45. public static void linesCount(){
  46. System.out.println("123\n12\r3".lines().count());
  47. }
  48. }

执行结果

true
这是一个很寂寞的天,下着有些伤心的雨    !
这是一个很寂寞的天,下着有些伤心的雨!
    flower!
flower    !
123123123
3

Optional中新增API

Optional中也增加了几个方法,现在可以很方便的讲一个 Optional转换成一个Stream,或者当一个空Optional时给他一个代替

API

image.png

代码

package com.dance;

import java.util.Optional;

public class OptionalApiTest {
    public static void main(String[] args) {
        isEmpty();
        ifPresentOrElse("abc");
        ifPresentOrElse(null);
        System.out.println(or("abc"));
        System.out.println(or(null));
        orElseThrow();
    }

    /**
     * 判断当前Optional是否为空
     */
    public static void isEmpty() {
        // 创建一个空的
        Optional<Object> empty = Optional.empty();
        // 调用方法
        // 是否存在
        System.out.println(empty.isPresent());
        // 是否为空
        System.out.println(empty.isEmpty());
    }

    /**
     * 如果值非空执行参数1,为空执行参数2
     *
     * @param str 字符串
     */
    public static void ifPresentOrElse(String str) {
        Optional.ofNullable(str).ifPresentOrElse(
                s -> {
                    System.out.println("value is " + s + " insert to db...");
                },
                () -> {
                    System.out.println("value is empty insert to db...");
                });
    }

    /**
     * 如果value有值,就返回自身,没有值就返回参数1的结果
     *
     * @param str 字符串
     */
    private static Optional<String> or(String str) {
        return Optional.ofNullable(str).or(() -> {
            System.out.println("select to db by xxx....");
            return Optional.of("db data");
        });
    }

    /**
     * 如果值不为空就返回值,为空就抛异常
     */
    public static Object orElseThrow(){
        return Optional.ofNullable(null).orElseThrow();
    }
}

执行结果

false
true
value is abc insert to db...
value is empty insert to db...
Optional[abc]
select to db by xxx....
Optional[db data]
Exception in thread "main" java.util.NoSuchElementException: No value present
    at java.base/java.util.Optional.orElseThrow(Optional.java:382)
    at com.dance.OptionalApiTest.orElseThrow(OptionalApiTest.java:59)
    at com.dance.OptionalApiTest.main(OptionalApiTest.java:12)

局部变量类型推断升级

在var 上添加注解的语法格式,在JDK10中是不能实现的,在JDK11中加入了这样的语法

代码

package com.dance;

import java.util.function.Consumer;

public class LocalVariableTest {
    public static void main(String[] args) {
        // 错误的形式: 必须要有类型,可以加上var
//        Consumer<String> consumer = (String t) -> System.out.println(t.toUpperCase());
        // 在不使用var的前提下可以显示声明类型
        Consumer<String> consumer = (@Deprecated String t) -> System.out.println(t.toUpperCase());
        // 使用var声明,其实还是语法糖,应为已经通过前面的泛型推断出来了后面的类型
        Consumer<String> consumer2 = (@Deprecated var t) -> System.out.println(t.toUpperCase());
    }
}

全新的HTTP客户端API

  • 这是Java9开始引入的一个处理HTTP请求的HTTP Client API ,该API支持同步和异步,以前是在jdk.incubator.httpclient包下的,在Java的依赖库中是找不到的,需要单独添加模块,而在JDK11中已经为正式可用状态,已经可以在Java.net网络包中找到了

    更简化的编译运行程序

    看下面的代码 // 编译 javac xxx.java // 运行 java xxx 在我们的认知里面,要运行一个Java源代码必须先编译,再运行,两步执行动作,而在未来的Java11中,通过一个Java 命令就直接搞定了 // 举例 java xxx.java

一个命令编译运行源代码的注意点:

  • 执行源文件中的第一个类,第一个类必须包含主方法
  • 并且不可以使用其他源文件中的自定义类,本文件中的自定义类是可以使用的

    废弃Nashorn引擎

    废除Nashorn javascript引擎,在后续版本准备移除掉,有需要的可以考虑使用GraalVM

    ZGC

  • GC是Java主要优势之一,然而当GC时间过长,就会开始影响应用的响应时间,消除或者减少GC停顿时长,Java将会对更广泛的应用场景是一个更有吸引力的平台,此外,现在系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存,并且无需长时间的GC暂停时间

  • ZGC, A Scalable low-latency Garbage Conllector(Experimental)
    • 翻译: ZGC,一个可扩展的低延迟垃圾收集器(实验)
    • 这是JDK11最瞩目的特性,没有之一,但是后面带了experimental,说明这还不建议用到生产环境
  • ZGC是一个并发, 基于region(区域),压缩型的垃圾收集器,只有ROOT扫描阶段会STW(Stop the world),因此GC停顿时间不会随着堆的增长而变长
  • 优势
    • GC暂停时间不会超过10ms
    • 既能处理几百兆的小堆,也能处理几个T的大堆(OMG…)
    • 和G1相比,应用吞吐能力不会下降超过15%
    • 为未来的GC功能和利用colord(彩色的)指针以及Load barriers(负载屏障)优化奠定基础
    • 初始只支持64位系统
  • ZGC的设计目标是: 支持TB级内存容量,暂停延迟低(<10ms),对整个程序吞吐量的影响小于15%,将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如:多层堆(即热对象置于DRAM和冷对象置于NVMe闪存)或堆压缩

详细了解

其他新特性

  • Unicode10
  • Deprecate the Pack200 Tools And API
  • 新的Epsilon垃圾收集器
  • 完全支持Linux容器(包括Docker)
  • 支持G1上的并行完全垃圾收集
  • 最新的HTTPS安全协议TLS 1.3
  • Java Flight Recorder