JDK8-17新特性简述

1.JDK8新特性

1.1 Lambda表达式

        Lambda 表达式是一种匿名函数(不是匿名内部类),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。它实质属于函数式编程的概念。

        虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的抽象方法,不是规定接口中只能有一个方法,称为函数式接口。

->左面: ​ 参数类型可以省略不写,类型推断。 ​ 如果只有一个参数,()可以省略不写。 ​

->右侧: ​ {}将方法体的具体内容包裹起来。 ​ 方法体中只有一条执行语句,{}可以省略不写。 ​ 如果执行语句就一条return语句,return 和 {}可以同时省略不写。

1.2 函数式接口

        接口中只能有一个抽象方法,其他的可以有default、static、Object里继承的方法等。JDK8专门提供了@FunctionalInterface注解,用来进行编译检查。

        作用:在Java中主要用在Lambda表达式和方法引用(想使用Lambda表达式,接口必须为函数式接口)。

JDK内置的函数式接口

        这里特别介绍四个函数式接口:

函数式接口方法名输入参数输出参数作用
消费型接口Consumervoid accept(T t)Tvoid对类型为T的对象进行操作
供给型接口SupplierT get()voidT返回类型为T的对象
函数型接口FunctionR apply(T t)TR对类型为T的对象进行操作,返回类型为R的对象
断言型接口Predicateboolean test(T t)Tboolean对类型为T的对象进行操作,返回布尔类型结果

1.3 方法引用

        方法引用是一个更加紧凑,易读的 Lambda 表达式,注意方法引用是一个 Lambda 表达式,方法引用操作符是双冒号 "::"。

方法引用有下面几种方式:

  1. 对象引用::实例方法名

  2. 类名::静态方法名

  3. 类名::实例方法名

  4. 类名::new (也称为构造方法引用)

  5. 类型[]::new (也称为数组引用)

1.4 stream流式编程

        stream是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的聚合操作或者大批量数据操作。  

        Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。

        同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。

Stream有如下三个操作步骤:

一、创建Stream:从一个数据源,如集合、数组中获取流。

二、中间操作:一个操作的中间链,对数据源的数据进行操作。

三、终止操作:一个终止操作,执行中间操作链,并产生结果。

1.5 Optional

        Optional存在的意义就是简化为了防止空指针而进行的if..else等判断的代码。

获取Optional对象
  1. 通过Optional.of()方法,传递的参数的值为null,会出现空指针异常。

  2. 通过Optional.ofNullable()方法,创建Optional对象。

获取Optional中存储的值
     可以通过get()获取到全局value对应的值。  
判断传递的参数是否为null

     ifPresent(Consumer<? super T> consumer) 可以判断是否为null

  1. 为null, 不会执行Consumer的实现。

  2. 不为null, 执行Consumer的实现。

filter() 过滤

2.JDK9新特性

2.1 模块化系统

        本质上讲也就是,用模块来管理各个package,通过声明某个package暴露,模块(module)的概念,其实就是package外再裹一层,不声明默认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪些部分可以暴露,哪些部分隐藏。

        模块化的主要目的在于减少内存的开销, 并改进其安全性,可维护性,提高性能。

注意:使用外部模块时,要在当前项目的src目录下创建module-info.java来导入外部的模块并使用。对于当前模块,只有在导出后其他模块才能正常使用。

2.2 JShell命令

        以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。

        在安装JDK的目录下找到bin目录,在bin目录中找到jshell.exe双击即可运行。

2.3 接口私有方法

        默认的情况下,接口中的常量都是共有静态常量,接口中的方法都是抽象方法。JDK8之后接口中可以使用静态方法和默认方法。JDK9之后接口中可以使用私有方法。

2.4 try语句的增强

        Java 8 中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过。

        Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始化过的资源,此时的资源是final的。

2.5 String存储结构的改变

        String 不再用 char[] 来存储,改成了 byte[] 加上编码标记,节约了一些空间。同时也会影响到StringBuffer 和 StringBuilder中的字符串操作。

2.6 集合特性of()方法

        使用of()方法更快捷高效地添加元素来创建一个只读、不可改变的集合。

2.7 InputStream的增强

        transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法。

2.8 Stream API的增强

        在 Java 9 中,Stream 接口中添加了 4 个新的方法:takeWhile, dropWhile, ofNullable,还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

        除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 stream() 将一个 Optional 对象转换为一个(可能是空的) Stream 对象。

2.8.1 takeWhile()

        用于从 Stream 中获取一部分数据,通过接收一个 Predicate 来进行条件选择。在有序的Stream 中,takeWhile 会返回从开头开始的尽量多的元素

 2.8.2 dropWhile()

        dropWhile 的行为与 takeWhile 相反,返回剩余的元素

 2.8.3 ofNullable()

        Java 9 中的 ofNullable 方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空Stream。

2.8.4 iterate新重载方法

        这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

3.JDK10新特性

3.1 局部变量类型推断

                              

在局部变量中使用时,如下情况不适用:  

        1.初始值为null

        2.方法引用

        3.lambda表达式

        4.为数组静态初始化

3.2 不可变集合copyOf()方法

         在JDK10中新增了copyOf()方法,该方法会先判断来源集合是不是AbstractImmutableList 类型。如果是,直接将来源集合返回;如果不是,调用of()创建一个新的集合。

4.JDK11新特性

4.1 ZGC垃圾回收器

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

        ZGC, A Scalable Low-Latency Garbage Collector(Experimental)ZGC, 这应该是JDK11最为瞩目的特性, 没有之一。 但是后面带了Experimental,说明这还不建议用到生产环境。

        ZGC是一个并发, 基于region, 压缩型的垃圾收集器, 只有root扫描阶段会STW(stop the world), 因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。

优势
  • GC暂停时间不会超过10ms

  • 既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)

  • 和G1相比, 应用吞吐能力不会下降超过15%

  • 为未来的GC功能和利用colord指针以及Load barriers优化奠定基础

  • 初始只支持64位系统

4.2 Optional增强

4.3 新增Http客户端API

        在Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该API 支持同步和异步,而在 Java 11 中已经为正式可用状态,可以在java.net 包中找到这个 API。

        它将 替 代 仅 适 用 于 blocking 模 式 的 HttpURLConnection,并提供对WebSocket 和 HTTP/2的支持。

使用HttpClient发送请求和接收响应一般分为以下几步:
  1. 创建HttpClient对象。
  2. 创建某种请求方法对象,并按需指定请求信息(包括:URL、请求参数、Header、Cookie等信息)。例如:发送Get请求则创建HttpGet对象,发送Post请求则创建HttpPost对象。
  3. 调用HttpClient对象的execute方法来执行第2步中创建的请求方法对象,并得到HttpResponse响应对象。
  4. 通过HttpResponse响应对象按需读取返回结果(包括:返回数据、Header、Cookiet等信息)。
  5. 释放连接(无论执行方法是否成功,都必须释放连接)。

5.JDK14新特性

5.1 改进空指针异常

        Java14之前,NEP报错信息不会指出为Null的实例具体是那一个。Java14以后的NEP则会明确表明,触发NEP的对象是哪个。

6.JDK15新特性

6.1 语言特性增强(Text Blocks)

        文本块,是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并让开发人员在需要时可以控制格式。

        

7. JDK16新特性

7.1 Switch升级

        目的是为了解决switch语句的一些不规则性成为障碍。比如case标签之间的默认控制行为,case块中的默认范围,无意义的break语句。

JDK16之前:

JDK16之后: 

再进行简化后:

多种情况case如下:
当case中需要进行操作时,需要使用{}将内容包含起来,并使用yield进行赋值操作:

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值