zoukankan      html  css  js  c++  java
  • JDK11新特性

    2,字符串加强

    Java 11增加了一系列的字符串处理方法,如以下所示。

    // 判断字符串是否为空白
    
    " ".isBlank();                // true
    
    // 去除首尾空格
    
    " Javastack ".strip();          // "Javastack"
    
    // 去除尾部空格 
    
    " Javastack ".stripTrailing();  // " Javastack"
    
    // 去除首部空格 
    
    " Javastack ".stripLeading();   // "Javastack "
    
    // 复制字符串
    
    "Java".repeat(3);             // "JavaJavaJava"
    
    // 行数统计
    
    "A
    B
    C".lines().count();    // 3
    

    3,集合加强

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

    示例1:

    var list = List.of("Java", "Python", "C");
    
    var copy = List.copyOf(list);
    
    System.out.println(list == copy);   // true
    

    示例2:

    var list = new ArrayList<String>();
    
    var copy = List.copyOf(list);
    
    System.out.println(list == copy);   // false
    

    示例1和2代码差不多,为什么一个为真,一个为假的?

    来看下它们的源码:

    static <E> List<E> of(E... elements) {
    
        switch (elements.length) { // implicit null check of elements
    
            case 0:
    
                return ImmutableCollections.emptyList();
    
            case 1:
    
                return new ImmutableCollections.List12<>(elements[0]);
    
            case 2:
    
                return new ImmutableCollections.List12<>(elements[0], elements[1]);
    
            default:
    
                return new ImmutableCollections.ListN<>(elements);
    
        }
    
    }
    
    static <E> List<E> copyOf(Collection<? extends E> coll) {
    
        return ImmutableCollections.listCopy(coll);
    
    }
    
    static <E> List<E> listCopy(Collection<? extends E> coll) {
    
        if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {
    
            return (List<E>)coll;
    
        } else {
    
            return (List<E>)List.of(coll.toArray());
    
        }
    
    }
    

    看出可以copyOf方法会先判断来源集合的英文不是AbstractImmutableList类型的,如果是,就直接返回,如果不是,调用则of创建³³一个新的集合。

    示例2因为用的新创建的集合,不属于不可变AbstractImmutableList类的子类,所以copyOf方法又创建了一个新的实例,所以为false。

    注意:使用和copyOf创建的集合为不可变集合,不能进行添加,删除,替换,排序等操作,不然会报java.lang.UnsupportedOperationException异常。

    上面演示了List的和copyOf方法,Set和Map接口都有。

    4,流加强

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

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

    Stream.ofNullable(null).count(); // 0
    

    2)增加takeWhile和dropWhile方法

    Stream.of(1, 2, 3, 2, 1)
    
        .takeWhile(n -> n < 3)
    
        .collect(Collectors.toList());  // [1, 2]
    

    从开始计算,当n <3时就截止。

    Stream.of(1, 2, 3, 2, 1)
    
        .dropWhile(n -> n < 3)
    
        .collect(Collectors.toList());  // [3, 2, 1]
    

    这个和上面的相反,一旦n <3不成立就开始计算。

    3)迭代重载

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

    如果你对JDK 8中的Stream还不熟悉,可以看之前分享的这一系列教程。

    5,可选加强

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

    Optional.of("javastack").orElseThrow();     // javastack
    
    Optional.of("javastack").stream().count();  // 1
    
    Optional.ofNullable(null)
    
        .or(() -> Optional.of("javastack"))
    
        .get();   // javastack
    

    6,InputStream加强

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

    var classLoader = ClassLoader.getSystemClassLoader();
    
    var inputStream = classLoader.getResourceAsStream("javastack.txt");
    
    var javastack = File.createTempFile("javastack2", "txt");
    
    try (var outputStream = new FileOutputStream(javastack)) {
    
        inputStream.transferTo(outputStream);
    
    }
    

    7,HTTP客户端API

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

    来看一下HTTP Client的用法:

    var request = HttpRequest.newBuilder()
    
        .uri(URI.create("https://javastack.cn"))
    
        .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);
    

    上面的.GET()可以省略,默认请求方式为!

    更多使用示例可以看这个API,后续有机会再做演示。

    现在Java自带了这个HTTP Client API,我们以后还有必要用Apache的HttpClient工具包吗?

    8,化繁为简,一个命令编译运行源代码

    看下面的代码。

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

    在我们的认知里面,要运行一个Java源代码必须先编译,再运行,两步执行动作。而在未来的Java 11版本中,通过一个java命令就直接搞定了,如以下所示。

    java Javastack.java
  • 相关阅读:
    数字问题-LeetCode 462、463、473、474、475、476、477、482(二分)
    数字问题-LeetCode 452、453、454、455、456、459(KMP算法)
    Python之多进程、多线程---王要胜---2020-01-01
    生活与思考
    英文每日记录
    运维面试题五十题
    利用阿里云ECS跳板机内网穿透- ssh
    曾经的自己
    python 开发必备知识
    人生路上的思考
  • 原文地址:https://www.cnblogs.com/plxz/p/9713843.html
Copyright © 2011-2022 走看看