JDK11 | 第四篇 : 增强API

简介: JDK 9~11 在语言语法方面有一个小改动,增加了相当数量的新API,这一节讲解下JDK1.8之后新增的一些API。

文章首发于公众号《程序员果果》

地址 : https://mp.weixin.qq.com/s/O0xntC-JfeSBk-9x2QfwnA

一、简介

JDK 9~11 在语言语法方面有一个小改动,增加了相当数量的新API,这一节讲解下JDK1.8之后新增的一些API。

二、增强API

1. 集合的增强api

自Java 9开始,Jdk里面为集合(List / Set / Map)都添加了of和copyOf方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。

/**
 * List的增强api
 */
@Test
public void test1() {
    List<String> list = List.of( "aa", "bb", "cc", "dd" );
    System.out.println( list );

    // 抛出java.lang.UnsupportedOperationException 异常
    list.add( "ee" );

    System.out.println( list );

}

/**
 * Set的增强api
 */
@Test
public void test2() {
    Set<Integer> set1 = Set.of( 100 , 30 ,20 ,15);
    System.out.println(set1);
    // 抛出java.lang.IllegalArgumentException: duplicate element: 20
    Set<Integer> set2 = Set.of( 100 , 30 ,20 ,15 ,20 ,15 );
    // 抛出java.lang.UnsupportedOperationException 异常
    set2.add( 10 );
    System.out.println(set2);
}

/**
 * Map的增强api
 */
@Test
public void test3() {
    Map<String , Integer> map = Map.of("a" , 1 , "b" , 2 , "c" , 3);
    // 抛出java.lang.UnsupportedOperationException 异常
    map.put( "d" , 4 );
    System.out.println(map);
}

使用of()方法创建的集合,为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。

2. Stream的增强api

Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法。

增加单个参数构造方法,可为null

@Test
public void test1() {
    long count = Stream.ofNullable( null ).count();
    System.out.println(count);
}

增加 takeWhile 和 dropWhile 方法

takeWhile:从集合开头提取符合条件的元素

@Test
public void test2() {
    List<Integer> res = Stream.of( 1, 2, 3,4, 0, 1 )
            .takeWhile( n -> n < 4 )
            .collect( Collectors.toList() );
    System.out.println(res);
}

dropWhile:从集合开头移除前符合条件的元素

@Test
public void test3() {
    List<Integer> res = Stream.of( 1, 2, 3,4, 0, 1 )
            .dropWhile( n -> n < 4 )
            .collect( Collectors.toList() );
    System.out.println(res);
}

3. 字符串增强api

Java 11增加了一系列的字符串处理方法。

@Test
public void test1() {
    //判断字符串是否为空白
    boolean res1 = " ".isBlank();
    //true
    System.out.println(res1);

    //去除首尾空格
    String res2 = " java ~ ".strip();
    // "java ~"
    System.out.println(res2);

    //去除尾部空格
    String res3 = " java ~ ".stripTrailing();
    //" java ~"
    System.out.println(res3);

    //去除首部空格
    String res4 = " java ~ ".stripLeading();
    //"java ~ "
    System.out.println(res4);

    //复制字符串
    String res5 = "java".repeat( 3 );
    // "java"
    System.out.println(res5);

    //行数统计
    long res6 = "A\nB\nC".lines().count();
    //3
    System.out.println(res6);

}

4. Optional增强api

Opthonal也增加了几个非常酷的方法,现在可以很方便的将一个可选转换成一个Stream,或者当一个空可选时给它一个替代的。

@Test
public void test1() {
    //java ~
    String res1 = Optional.of( "java ~" ).orElseThrow();
    System.out.println(res1);

    //1
    long res2 = Optional.of( "java ~" ).stream().count();
    System.out.println(res2);

    //java ~
    Object res3 = Optional.ofNullable( null )
            .or( () -> Optional.of( "java ~" ) )
            .get();
    System.out.println(res3);
}

5. 输入流增强api

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

@Test
public void test1() {
    try {
        InputStream inputStream = TestInputStream.class.getClassLoader().getResourceAsStream("test.txt");
        var file = new File("/Users/xxx/test2.txt");
        try (var outputStream = new FileOutputStream(file)) {
            inputStream.transferTo(outputStream);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

6. HTTP客户端增强api

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

@Test
public void test1() {
    try {
        var request = HttpRequest.newBuilder()
                .uri( URI.create("http://t.weather.sojson.com/api/weather/city/101020100"))
                .GET()
                .build();

        var client = HttpClient.newHttpClient();

        // 同步
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());

        //异步
        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .join();
    } catch (Exception e) {
        e.printStackTrace();

    }
}
相关文章
|
Java API
JDK API文档中文版(1.6、1.8、1.9)(附百度网盘下载地址)
JDK API文档中文版(1.6、1.8、1.9)(附百度网盘下载地址)
1688 0
JDK API文档中文版(1.6、1.8、1.9)(附百度网盘下载地址)
|
2月前
|
监控 Java API
JDK 9新特性深度探索:平台日志API和服务
本文将深入探讨JDK 9中引入的平台日志API和服务。这一新特性为Java应用程序提供了更强大、灵活的日志记录功能,帮助开发者更好地监控和诊断应用程序的运行状况。本文将详细介绍平台日志API和服务的特性和优势,以及如何在项目中应用这一新特性来提升应用程序的稳定性和可维护性。
|
2月前
|
Java API 数据处理
JDK 8:Stream API——数据处理的新篇章
JDK 8引入了Stream API,为Java中的数据处理提供了一种全新的方式。本文将详细介绍Stream API的原理、优势以及如何在实际开发中应用这一特性。
|
9月前
|
安全 Java API
JDK8新特性之日期时间API
JDK8新特性之日期时间API-案例实操
60 1
JDK8新特性之日期时间API
|
5月前
|
存储 SQL Java
【JDK新特性】必会_Stream API
【JDK新特性】必会_Stream API
|
6月前
|
安全 Java 编译器
JDK11 介绍讲解,语法改进,API增强
JDK 11进一步完善了JDK 9引入的模块化系统。模块化系统允许开发人员将代码和依赖项组织成模块,以提高可维护性、安全性和性能。开发人员可以使用`module`关键字定义模块,并使用`requires`和`exports`语句来声明模块之间的依赖关系和对外暴露的API。模块化系统还提供了更细粒度的访问控制,可以限制对模块中的内部API的访问。
102 0
|
7月前
|
存储 Java API
JDK9特性——语法、API的改变
JAVA8 中,匿名内部类不能使用钻石操作符,如下代码在JAVA8 中是报错的,匿名内部类这里不支持泛型推断,重写的方法不明确泛型
47 0
|
监控 JavaScript 安全
jdk17文档中的JDK API模块介绍
jdk17文档中的JDK API模块介绍
jdk17文档中的JDK API模块介绍
|
IDE 安全 Java
Java 版本、语言规范、API、JDK、IDE、Java 源程序编译、执行原理(跨平台性根本原因)、特殊字符用法、8 大数据类型小结
Java 版本、语言规范、API、JDK、IDE、Java 源程序编译、执行原理(跨平台性根本原因)、特殊字符用法、8 大数据类型小结
149 0
Java 版本、语言规范、API、JDK、IDE、Java 源程序编译、执行原理(跨平台性根本原因)、特殊字符用法、8 大数据类型小结
|
Java API
Java(JDK)13新特性之Reimplement the Legacy Socket API
Java(JDK)13新特性之Reimplement the Legacy Socket API
161 0