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

Java的新特性

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

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 表达式很好兼容,设计出函数式接口。

@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:


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新特性

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


Java模块化

什么是模块化?

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

什么是 JDK 9 模块化?

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

Java 9 模块的重要特征:

不可变集合工厂方法

为了创建不可变集合,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)方法。

砖石操作符

        //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 添加了很多新的有用方法,如:


多版本兼容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 引入以下这些方法,丰富了流处理操作:


其他


Java10新特性

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


局部变量类型推断

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

不可变集合的改进

JDK 10 中,List,Set,Map 提供了一个新的静态方法 copyOf(Collection<? extends E> 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(),在没有值时抛出异常

其他新特性

Java11新特性

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


字符串操作

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


用于 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 源代码。


// 编译 javac Demo.java
// 运行 java Demo
java Demo.java

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

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

其他一些特性

Java12新特性

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

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 操作

Files.mismatch(Path, Path)

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

Teeing Collector

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

其他特性

Java13新特性

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

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

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

文本块升级

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

String html = "
" +"    
" + 
"        

Hello

" +" " +" ";


Java 13 之后,清爽多了

String html = """

Hello

""";

SocketAPI 重构

FileSystems.newFileSystem 新方法

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


增强 ZGC 释放未使用内存

其他特性


Java14新特性

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

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 标准化,成为稳定版本。


改进 NullPointerExceptions 提示信息

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

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



展开阅读全文

页面更新:2024-04-06

标签:注解   表达式   线程   字符串   车轮   模块   特性   接口   垃圾   语言   类型   版本   方法   经典

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top