细数Java8-14的那些经典特性,语言的车轮正在滚滚向前

细数Java8-14的那些经典特性,语言的车轮正在滚滚向前

编码文章call10242025-02-01 3:36:5213A+A-

Java的新特性

Lambda表达式

Lambda表达式(也称为闭包)它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理,在没有Lambda表达式之前,Java只能使用名内部类代替Lambda表达式。


Lambda的设计耗费了很多时间和很大的社区力量,最终找到一种折中的实现方案,可以实现简洁而紧凑的语言结构。最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成。

Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

上述代码中参数e的类型是由编译器推理得出的,也可以显式指定该参数的类型。

Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );

函数式接口

Lambda 的设计者为了让现有的功能与 Lambda 表达式很好兼容,设计出函数式接口。

  • 函数式接口是指只有一个函数的接口,可以隐式转换为 lambada 表达式。
  • Java 8 提供了注解 @FunctionalInterface,显示声明一个函数式接口。
  • java.lang.Runnable 和 java.util.concurrent.Callable 是函数式接口的例子~
@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface Runnable is used
     * to create a thread, starting the thread causes the object's
     * run method to be called in that separately executing
     * thread.
     * 

* The general contract of the method run is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }

方法引用

方法引用提供了非常有用的语法,可以直接引用已有 Java 类或对象(实例)的方法或构造器。它与 Lambda 表达式配合使用,可以减少冗余代码,使代码更加简洁。

    public static void main(String[] args) {
        Consumer consumer = System.out::println;
        consumer.accept("打印日志");
    }


默认方法

默认方法就是一个在接口里面有了一个实现的方法。它允许将新方法添加到接口,但不强制实现了该接口的类必须实现新的方法。

public interface DemoService {
    /**
     * 默认实现的方法
     **/
    default void method1() {
        System.out.println("xxx");
    }
    
    void method2();
}


Stream API

Stream API,支持对元素流进行函数式操作,它集成在 Collections API 中,可以对集合进行批量操作。常用 API:

  • filter 筛选
  • map 流映射
  • reduce 将流中的元素组合起来
  • collect 返回集合
  • sorted 排序
  • flatMap 流转换
  • limit 返回指定流个数
  • distinct 去除重复元素


Optional

Java 8 引入 Optional 类,用来解决 NullPointerException。Optional 代替 if...else 解决空指针问题,使代码更加简洁。

Optional optional = Optional.ofNullable(userRepository.getOne(1L));
optional.ifPresent(u -> System.out.println(user));


Date Time API

JDK 8 之前的日期 API 处理存在非线程安全、时区处理麻烦等问题。Java 8 在 java.time 包下提供了新的日期 API,简化了日期的处理~

    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        int year = today.getYear();
        System.out.println("今年是" + year);
        //是否闰年
        System.out.println("今年是不是闰年:" + today.isLeapYear());


        LocalDateTime todayTime = LocalDateTime.now();
        System.out.println("当前时间" + todayTime);
        //时区指定
        System.out.println("美国时间:" + ZonedDateTime.of(todayTime, ZoneId.of("America/Los_Angeles")));


        LocalDate specailDate = LocalDate.of(2020, 6, 20);
        LocalDate expectDate = specailDate.plus(100, ChronoUnit.DAYS);
        System.out.println("比较特别的一天" + specailDate);
        System.out.println("特殊日期的 100 天" + expectDate);
    }

重复注解

重复注解,即一个注解可以在一个类、属性或者方法上同时使用多次,用 @Repeatable 定义重复注解


public @interface ScheduleTimes {
    ScheduleTime[] value();
}


@Repeatable(ScheduleTimes.class)
public @interface ScheduleTime {
    String value();
}


public class ScheduleTimeTask {
    @ScheduleTime("10")
    @ScheduleTime("12")
    public void doSomething() {


    }
}

Base64

Java 8 把 Base64 编码的支持加入到官方库中。

    public static void main(String[] args) {
        String str = "新消息";
        String encoded = Base64.getEncoder().encodeToString(str.getBytes( StandardCharsets.UTF_8));
        System.out.println("Base64编码字符串:" + encoded);
        String decoded = new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8);
        System.out.println("Base64解码字符串:" + decoded);
    }


JVM新特性

使用元空间 Metaspace 代替持久代(PermGen space),JVM 参数使用-XX:MetaSpaceSize 和-XX:MaxMetaspaceSize 设置大小。


Java9新特性


Java模块化

什么是模块化?

一个大型系统,比如一个商城网站,它会包含很多模块的,如:订单模块,用户信息模块,商品信息模块,广告位模块等等。各个模块之间会相互调用。如果每个模块单独运行都会带动其他所有模块,性能非常低效。但是,如果某一模块运行时,只会启动它所依赖的模块,性能会大大提升。这就是 JDK 9 模块化的思想。

什么是 JDK 9 模块化?

Java 平台模块系统,即 Project Jigsaw,把模块化开发实践引入到了 Java 平台中。在引入了模块系统之后,JDK 被重新组织成 94 个模块。Java 应用可以通过新增的 jlink 工具,创建出只包含所依赖的 JDK 模块的自定义运行时镜像。这样可以极大地减少 Java 运行时环境的大小。

Java 9 模块的重要特征:

  • 在其工件(artifact)的根目录中包含了一个描述模块的 module-info.class 文 件。
  • 工件的格式可以是传统的 JAR 文件或是 Java 9 新增的 JMOD 文件。
  • 这个文件由根目录中的源代码文件 module-info.java 编译而来。
  • 该模块声明文件可以描述模块的不同特征。

不可变集合工厂方法

为了创建不可变集合,JDK9 之前是这样的:

    public static void main(String[] args) {
        List stringList = new ArrayList<>();
        stringList.add("1:");
        stringList.add("2");
        List  unmodifiableList = Collections.unmodifiableList(stringList);
    }

JDK 9 提供了 List.of()、Set.of()、Map.of()和 Map.ofEntries()等工厂方法来创建不可变集合:

List unmodifiableList = List.of("1","2");

接口支持私有方法

JDK 8 支持在接口实现默认方法和静态方法,但是不能在接口中创建私有方法,为了避免了代码冗余和提高阅读性,JDK 9 在接口中支持私有(private)方法。

砖石操作符

  • 钻石操作符是在 java 7 中引入的,可以让代码更易读,但它不能用于匿名的内部类。
  • 在 java 9 中, 它可以与匿名的内部类一起使用,从而提高代码的可读性。
        //JDK 5,6
        Map map56 = new HashMap();
        //JDk 7,8
        Map map78 = new HashMap<>();
        //JDK 9 结合匿名内部类的实现 
        Map map9 = new HashMap<>(){};

Optional类改进

java 9 中,java.util.Optional 添加了很多新的有用方法,如:

  • stream()
  • ifPresentOrElse()
  • or()


多版本兼容jar包

很多公司使用的 JDK 都是老版本的,JDK6、JDk5 ,甚至 JDk4 的,不是他们不想升级 JDk 版本,而是担心兼容性问题。JDK 9 的一个新特性,多版本兼容 Jar 包解决了这个问题。

JDK 9 的这个功能很强大,它可以让你的版本升级到 JDK 9,但是还是老版本的运行流程,即在老的运行流程继承新的功能~

JShell工具

jShell 工具相当于 cmd 工具,然后呢,你可以像在 cmd 工具操作一样,直接在上面运行 Java 方法,Java 语句等。

Try-with-resources改进

JDK 9 对 try-with-resources 异常处理机制进行了升级。

Stream API 的改进

JDK 9 为 Stream API 引入以下这些方法,丰富了流处理操作:

  • takeWhile()
  • dropWhile()
  • iterate
  • ofNullable


其他

  • HTTP 2 客户端 (支持 WebSocket 和 HTTP2 流以及服务器推送)
  • 进程 API(控制和管理操作系统进程)
  • String 底层存储结构更改(char[]替换为 byte[])
  • 标识符添加限制( String _ ="hello"不能用)
  • 响应式流 API (支持 Java 9 中的响应式编程)


Java10新特性


局部变量类型推断

JDK 10 增加了局部变量类型推断(Local-Variable Type Inference)功能,让 Java 可以像 Js 里的 var 一样可以自动推断数据类型。Java 中的 var 是一个保留类型名称,而不是关键字。

不可变集合的改进

JDK 10 中,List,Set,Map 提供了一个新的静态方法 copyOf(Collection coll),它返回 Collection 集合一个不可修改的副本。

并行全垃圾回收器 G1

JDK 9 引入 G1 作为默认垃圾收集器,执行 GC 时采用的是基于单线程标记扫描压缩算法(mark-sweep-compact)。为了最大限度地减少 Full GC 造成的应用停顿的影响,Java 10 中将为 G1 引入多线程并行 GC,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

线程本地握手

Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这将会很方便使得停止单个线程或不停止线程成为可能。

Optional 新增 orElseThrow()方法

Optional、OptionalDouble 等类新增一个方法 orElseThrow(),在没有值时抛出异常

其他新特性

  • 基于 Java 的 实验性 JIT 编译器
  • 类数据共享
  • Unicode 语言标签扩展
  • 根证书
  • 基于时间(Time-Based)的版本控制模型

Java11新特性


字符串操作

String 类是 Java 最常用的类,JDK 11 增加了一系列好用的字符串处理方法


  • isBlank() 判空。
  • strip() 去除首尾空格
  • stripLeading() 去除字符串首部空格
  • stripTrailing() 去除字符串尾部空格
  • lines() 分割获取字符串流。
  • repeat() 复制字符串

用于 Lambda 参数的局部变量语法

局部变量类型推断是 Java 10 引入的新特性,但是不能在 Lambda 表达式中使用。Java 11 再次创新,它允许开发者在 Lambda 表达式中使用 var 进行参数声明。

标准化 HTTP Client

Java 9 引入 Http Client API,Java 10 对它更新,Java 11 对它进行标准化。这几个版本后,Http Client 几乎被完全重写,支持 HTTP/1.1 和 HTTP/2 ,也支持 websockets。

单个命令编译运行源代码

Java 11 增强了 Java 启动器,使之能够运行单一文件的 Java 源代码。


  • Java 11 之前,要运行一个 Java 源代码必须先编译,再运行
// 编译 javac Demo.java
// 运行 java Demo
  • Java 11 之后,只要一个 java 命令就搞定
java Demo.java

ZGC:可伸缩低延迟垃圾收集器

ZGC ,即 Z Garbage Collector(垃圾收集器或垃圾回收器)。它是一个可伸缩的、低延迟的垃圾收集器。ZGC 主要为了满足如下目标进行设计:

  • GC 停顿时间不超过 10ms
  • 既能处理几百 MB 的小堆,也能处理几个 TB 的大堆
  • 应用吞吐能力不会下降超过 15%(与 G1 回收算法相比)
  • 方便在此基础上引入新的 GC 特性和利用 colord
  • 针以及 Load barriers 优化奠定基础
  • 当前只支持 Linux/x64 位平台

其他一些特性

  • 添加 Epsilon 垃圾收集器。
  • 支持 TLS 1.3 协议
  • 飞行记录器分析工具
  • 动态类文件常量
  • 低开销的 Heap Profiling

Java12新特性

Switch 表达式扩展

传统的 switch 语句,容易漏写 break 而出错,同时写法并不简洁优雅。JDk 12 之后,Switch 表达式得到增强,能接受语句和表达式。

紧凑的数据格式

JDK 12 新增了 NumberFormat 对复杂数字的格式化

NumberFormat numberFormat = NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT);
System.out.println(numberFormat.format(100000));
//output 10 万


字符串支持 transform、indent 操作

  • transform 字符串转换,可以配合函数式接口 Function 一起使用
  • indent 缩进,每行开头增加空格 space 和移除空格

Files.mismatch(Path, Path)

Java 12 新增了 mismatch 方法,此方法返回第一个不匹配的位置,如果没有不匹配,则返回 -1L。

Teeing Collector

Teeing Collector 是 Streams API 中引入的新的收集器实用程序,它的作用是 merge 两个 collector 的结果.

其他特性

  • 支持 unicode 11(684 个新字符、11 个新 blocks、7 个新脚本)
  • JVM 常量 API (主要在新的 java.lang.invoke.constant 包中定义了一系列基于值的符号引用类型,能够描述每种可加载常量。)
  • Shenandoah GC(低暂停时间垃圾收集器)
  • G1 收集器提升 (可中止的混合收集集合、及时返回未使用的已分配内存)
  • 默认 CDS 档案
  • JMH 基准测试

Java13新特性

Switch 表达式扩展(引入 yield 关键字)

Java 13 之后,value break 语句不再被编译,而是用 yield 来进行值返回。

文本块升级

Java 13 之前,字符串不能够多行使用,需要通过换行转义或者换行连接符等等,反正就是好麻烦、好难维护。

String html = "\n" +"    \n" + 
"        

Hello

\n" +" \n" +"\n";


Java 13 之后,清爽多了

String html = """

Hello

""";

SocketAPI 重构

  • 传统的 Java Socket API(java.net.ServerSocket 和 java.net.Socket)依赖于 SocketImpl 的内部实现
  • 在 Java 13 之前,通过使用 PlainSocketImpl 作为 SocketImpl 的具体实现。
  • Java 13 中的新底层实现,引入 NioSocketImpl 的实现用以替换 SocketImpl 的 PlainSocketImpl 实现,此实现与 NIO(新 I/O)实现共享相同的内部基础结构,并且与现有的缓冲区高速缓存机制集成在一起。

FileSystems.newFileSystem 新方法

FileSystems 类中添加了以下三种新方法,以便更容易地使用将文件内容视为文件系统的文件系统提供程序:


  • 1、newFileSystem(Path)
  • 2、newFileSystem(Path, Map)
  • 3、newFileSystem(Path, Map)

增强 ZGC 释放未使用内存

  • ZGC 是 Java 11 中引入的最为瞩目的垃圾回收特性,是一种可伸缩、低延迟的垃圾收集器。但是实际使用中,它不能够主动将未使用的内存释放给操作系统。
  • Java 13 中对 ZGC 的改进,包括释放未使用内存给操作系统、支持最大堆大小为 16TB、JVM 参数-XX:SoftMaxHeapSize 来软限制堆大小

其他特性

  • 动态 CDS 存档, 扩展了 Java 10 中引入的类数据共享功能, 使用 CDS 存档变得更容易。
  • 文本块的字符串类新方法,如 formatted(Object…args),stripIndent()等。


Java14新特性

instanceof 模式匹配

instanceof 传统使用方式:

if (person instanceof Singer) {
  Singer singer = (Singer) person;
  singer.sing();
} else if (person instanceof Writer) {
  Writer writer = (Writer) person;
  writer.write();
}

Java 14 对 instanceof 进行模式匹配改进之后

if (person instanceof Singer singer) {
  singer.sing();
 } else if (person instanceof Writer writer) {
   writer.write();
 }


Record 类型(预览功能)

Java 14 将 Record 类型作为预览特性而引入,有点类似于 Lombok 的 @Data 注解。

Switch 表达式-标准化

switch 表达式在之前的 Java 12 和 Java 13 中都是处于预览阶段,终于在 Java 14 标准化,成为稳定版本。


  • Java 12 为 switch 表达式引入 Lambda 语法
  • Java 13 使用 yield 代替 break 关键字来返回表达式的返回值。

改进 NullPointerExceptions 提示信息

非常有帮助的空指针异常。通过精确描述哪个变量为空,提高JVM生成的NEP(NullPointerExceptions)的可用性。Java14之前,NEP报错信息不会指出为Null的实例具体是那一个。例如:a.b.c.d 出现NEP时,开发者无法确定究竟是a、b、c、d中的那个变量报了空指针。而在这个新特点的加入之后,NEP错误栈则会明确表明,触发NEP的对象是哪个。

我是Seven,一个不懈努力的程序猿,希望本文能对你有所裨益



点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4