zoukankan      html  css  js  c++  java
  • JDK11 | 第四篇 : 增强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
    B
    C".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();
    
        }
    }
    

    关注我


    欢迎扫码或微信搜索公众号《程序员果果》关注我,更多精彩内容不能错过 ~~

    (转载本站文章请注明作者和出处 程序员果果的博客

  • 相关阅读:
    正则表达式
    JavaIO详解
    Java集合类详解
    Java虚拟机原理图解
    关于Java中按值传递和按引用传递的问题详解
    图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)
    The 70th problem,UVa10396 Vampire Numbers
    二叉树的实现(Java语言描述)
    编程之路
    AngularJS 开发中常犯的10个错误
  • 原文地址:https://www.cnblogs.com/huanchupkblog/p/10947864.html
Copyright © 2011-2022 走看看