jdk11新特性——新加的一些更实用的API

news2024/9/20 8:01:33

目录

    • 一、集合 增强
      • 1.1、List集合 of()方法
      • 1.2、Set集合 of()方法
      • 1.3、Map集合 of()方法
      • 1.4、List集合copyOf()方法
      • 1.5、of()和copyOf()方法创建集合的注意事项
    • 二、Stream 增强
      • 2.1、Stream 新增of()方法
      • 2.2、Stream 新增ofNullable()方法
      • 2.3、Stream 新增takeWhile() 和 dropWhile()方法
        • 2.3.1、Stream中takeWhile() 方法示例
        • 2.3.2、Stream中dropWhile() 方法示例
      • 2.4、Stream 新增iterate()重载方法
    • 三、增加了一系列的字符串处理方法
      • 3.1、判断字符串是否为空白
      • 3.2、去除字符串首尾空白
      • 3.3、去除字符串尾部空白
      • 3.4、去除字符串首部空白
      • 3.5、复制字符串
      • 3.6、行数统计
    • 四、Optional 加强
      • 4.1、Optional.of()方法中如果传入的参数是null, 会抛出空指针异常
      • 4.2、Optional.ofNullable()可以兼容空指针, 但是实际传入null后要小心
      • 4.3、Optional.orElse() 如果内部引用为空, 则返回参数中的引用,否则返回内部引用
      • 4.4、optional.orElseThrow() 传入null后 抛异常

一、集合 增强

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

1.1、List集合 of()方法

  • of方法往List集合添加元素,示例如下:

    import java.util.List;
    public class Test1 {
        public static void main(String[] args) {
            t1();
        }
    	/**
         * list集合 ,往list集合添加元素
         * */
        public static void t1(){
            var list = List.of("a", "b", "c");
            System.out.println(list);
    
            list.add("d");//不可以添加元素
            System.out.println(list);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

1.2、Set集合 of()方法

  • of方法往Set集合添加元素,示例如下:
    import java.util.Set;
    public class Test1 {
        public static void main(String[] args) {
            t2();
        }
    	/**
         * set集合 ,往set集合添加元素
         * */
        public static void t2(){
            var set1 = Set.of("a", "b", "c");
            System.out.println("添加的集合元素:"+set1);
            System.out.println("所属的类信息:"+set1.getClass());
            //添加重复元素时,不是无法添加,而是抛出异常
            var set = Set.of("a", "b", "c","c");
            System.out.println(set);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

1.3、Map集合 of()方法

  • of方法往Map集合添加元素,示例如下:

    import java.util.Set;
    public class Test1 {
        public static void main(String[] args) {
            t3();
        }
    	/**
        * map集合
        * */
       public static void t3(){
           var map = Map.of("key1", "value1","key2","value2");
           System.out.println("添加的集合元素:"+map);
           System.out.println("所属的类信息:"+map.getClass());
       }
    }
    
  • 输出结果如下:在这里插入图片描述

1.4、List集合copyOf()方法

  • copyOf()方法复制集合元素,示例如下:

    import java.util.*;
    public class Test1 {
        public static void main(String[] args) {
            t4();
        }
    	/**
        * List集合copyOf()方法
        * */
       public static void t4(){
       	   //示例1
           var list = List.of("a", "b", "c");
           var copy  = List.copyOf(list);
           System.out.println(list == copy); // true
           //示例2
           var list1 = new ArrayList<String>();
           var copy1 = List.copyOf(list);
           System.out.println(list1 == copy1); // false
       }
    }
    
  • 输出结果如下:

    在这里插入图片描述

  • 示例1和2代码差不多,为什么一个为true,一个为false?

    由下图源码可以看出 copyOf 方法会先判断来源集合是不是 AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创建一个新的集合。
    在这里插入图片描述
    示例2因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例,所以为false.

1.5、of()和copyOf()方法创建集合的注意事项

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

二、Stream 增强

概述:Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法。
(1)、增加of()方法
(2)、增加单个参数构造方法,可为null
(3)、增加 takeWhile() 和 dropWhile()方法
(4)、iterate重载

2.1、Stream 新增of()方法

  • of()方法往Stream 流中新增元素,代码示例:

    package com.xz.jdk11.day1;
    import java.util.stream.Stream;
    public class Test2 {
        public static void main(String[] args) {
            t1();
        }
        public static void t1(){
            //Stream流中添加元素
            Stream<String> stream = Stream.of("a","b","c");
            stream.forEach(System.out::println);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

2.2、Stream 新增ofNullable()方法

  • Stream 中of()方法传入null,会被解析为是一个数组对象,会进一步访问它的长度信息。报空指针异常。示例代码如下:

    package com.xz.jdk11.day1;
    import java.util.stream.Stream;
    public class Test2 {
        public static void main(String[] args) {
            t2();
        }
        /**
         * Stream流操作
         * */
        public static void t2(){
            //Stream流中of()传入null,会被解析为是一个数组对象,会进一步访问它的长度信息
            Stream<String> stream = Stream.of(null);
            stream.forEach(System.out::println);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

  • Stream流中可以使用ofNullable传入null来创建流对象。示例代码如下:

    package com.xz.jdk11.day1;
    import java.util.stream.Stream;
    public class Test2 {
        public static void main(String[] args) {
            t2();
        }
    
        /**
         * Stream流操作
         * */
        public static void t2(){
            //Stream流中可以使用ofNullable传入null来创建流对象
            Stream<String> stream = Stream.ofNullable(null);
            stream.forEach(System.out::println);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

2.3、Stream 新增takeWhile() 和 dropWhile()方法

2.3.1、Stream中takeWhile() 方法示例

  • 示例代码

    package com.xz.jdk11.day1;
    	import java.util.stream.Stream;
    	public class Test2 {
    	    public static void main(String[] args) {
    	        t4();
    	    }
    	
    	    /**
    	     * Stream流操作
    	     * */
    	     public static void t4() {
            //从流中一直获取判定器为n < 3 的元素,一旦遇到元素 >3,就终止处理
            Stream<Integer> stream = Stream.of(1, 2, 3, 2, 1);
            Stream<Integer> stream2 = stream.takeWhile(n -> n < 3);
            stream2.forEach(System.out::println);
        }
    	}
    
  • 输出结果如下:
    在这里插入图片描述

2.3.2、Stream中dropWhile() 方法示例

  • 示例代码

    package com.xz.jdk11.day1;
    import java.util.stream.Stream;
    public class Test2 {
        public static void main(String[] args) {
            t5();
        }
    
        /**
         * Stream流操作
         * */
        public static void t5() {
            //从流中一直获取判定器为n < 3 不成立就开始计算
            Stream<Integer> stream = Stream.of(1, 2, 3, 2, 1);
            Stream<Integer> stream2 = stream.dropWhile(n -> n < 3);
            stream2.forEach(System.out::println);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

2.4、Stream 新增iterate()重载方法

  • 无限流的示例代码

    package com.xz.jdk11.day1;
    import java.util.stream.Stream;
    public class Test2 {
        public static void main(String[] args) {
            t6();
        }
        /**
         * Stream流操作
         * */
        public static void t6() {
            //无限流
            Stream<Integer> stream1 = Stream.iterate(1, t->(2*t)+1);
            //因为是无限流,即无限制的计算,因此通过limit()方法去限制输出结果
            stream1.limit(10).forEach(System.out::println);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

  • 有限流的示例代码

    package com.xz.jdk11.day1;
    import java.util.stream.Stream;
    public class Test2 {
        public static void main(String[] args) {
            t7();
        }
        /**
         * Stream流操作
         * */
         public static void t7() {
           //有限流,通过iterate()方法中第二个参数判定器指定什么时候结束迭代
           Stream<Integer> stream2 = Stream.iterate(1, t->t<20,t->(2*t)+1);
           stream2.forEach(System.out::println);
       }
    }
    
  • 输出结果如下:
    在这里插入图片描述

三、增加了一系列的字符串处理方法

3.1、判断字符串是否为空白

  • 示例代码

    public class Test3 {
        public static void main(String[] args) {
            t1();
        }
        /**
         * 判断字符串是否为空白
         * */
        public static void t1(){
            String str=" \t \r \n";
            boolean b = str.isBlank();
            System.out.println("判断字符串是否为空白:"+b);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

3.2、去除字符串首尾空白

  • 示例代码
public class Test3 {
    public static void main(String[] args) {
        t2();
        t3();
    }
     /**
     * 去除字符串首尾空白,包括英文和其他所有语言中的空白字符
     * */
    public static void t2(){
        String string = " \t  \r\n abc \t ";
        String string2 = string.strip(); 
        System.out.println("去除首尾空白的字符串="+string2);
        System.out.println("去除首尾空白的字符串长度="+string2.length());


    }

    /**
     * 去除字符串首尾空白,只能去除码值小于等于32的空白字符
     * */
    public static void t3(){
        String string = " \t  \r\n abc \t ";
        String string3 = string.trim(); 
        System.out.println("去除首尾空白的字符串="+string3);
        System.out.println("去除首尾空白的字符串长度="+string3.length());
    }
}
  • 输出结果如下:
    在这里插入图片描述

3.3、去除字符串尾部空白

  • 示例代码

    public class Test3 {
        public static void main(String[] args) {
            t4();
        }
        /**
         * 去除字符串尾部空白
         * */
        public static void t4(){
            String string=" \t \r\n abc \t ";
            String s = string.stripTrailing();
            System.out.println("去除字符串尾部空白的字符串="+s);
            System.out.println("去除字符串尾部空白的字符串长度="+s.length());
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

3.4、去除字符串首部空白

  • 示例代码

    public class Test3 {
        public static void main(String[] args) {
            t5();
        }
        /**
         * 去除字符串首部空白
         * */
        public static void t5(){
            String string = " \t  \r\n abc \t ";
            String s = string.stripLeading();
            System.out.println("去除字符串首部空白的字符串="+s);
            System.out.println("去除字符串首部空白的字符串长度="+s.length());
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

3.5、复制字符串

  • 示例代码

    public class Test3 {
        public static void main(String[] args) {
            t6();
        }
         /**
         * 复制字符串
         * */
        public static void t6(){
            String string = "abcd";
            String s = string.repeat(5);
            System.out.println("复制字符串="+s);
            System.out.println("复制字符串的长度="+s.length());
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

3.6、行数统计

  • 示例代码

    public class Test3 {
        public static void main(String[] args) {
            t7();
        }
        /**
         * 行数统计
         * */
        public static void t7(){
            String string = "abcd\n" +
                    "abcd";
            System.out.println("行数="+string.lines().count());
            string.lines().forEach(System.out::println);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

四、Optional 加强

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

4.1、Optional.of()方法中如果传入的参数是null, 会抛出空指针异常

  • 示例代码

    import java.util.Optional;
    public class Test4 {
        public static void main(String[] args) {
            t1();
        }
    
        /**
         * Optional.of()方法中如果传入的参数是null, 会抛出空指针异常
         * */
        public static void t1(){
            Optional<String> optional = Optional.of(null);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

4.2、Optional.ofNullable()可以兼容空指针, 但是实际传入null后要小心

  • 示例代码

    import java.util.Optional;
    public class Test4 {
        public static void main(String[] args) {
            t2();
        }
    
        /**
         * Optional.ofNullable()可以兼容空指针, 但是实际传入null后要小心
         * */
        public static void t2(){
            // optional.ofNullable可以兼容空指针, 但是实际传入null后要小心
            Optional<Object> optional = Optional.ofNullable(null);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

4.3、Optional.orElse() 如果内部引用为空, 则返回参数中的引用,否则返回内部引用

  • 示例代码

    import java.util.Optional;
    public class Test4 {
        public static void main(String[] args) {
            t3();
        }
    
         /**
         * Optional.orElse() 如果内部引用为空, 则返回参数中的引用,否则返回内部引用
         * */
        public static void t3(){
            // optional.ofNullable可以兼容空指针, 但是实际传入null后要小心
            Optional<Object> optional = Optional.ofNullable(null);
            // optional.orElse()方法 如果内部引用为空, 则返回参数中的引用 即abd
            Object object = optional.orElse("abc");
            System.out.println("返回参数中的引用=="+object);
    
            // optional.ofNullable可以兼容空指针, 但是实际传入null后要小心
            Optional<Object> optional1 = Optional.ofNullable("123");
            // optional.orElse()方法 如果内部引用不为空, 否则返回内部引用 即123
            Object object1 = optional1.orElse("abc");
            System.out.println("返回内部引用=="+object1);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

4.4、optional.orElseThrow() 传入null后 抛异常

  • 示例代码

    import java.util.Optional;
    public class Test4 {
        public static void main(String[] args) {
            t4();
        }
    
        /**
         *  optional.orElseThrow() 传入null后 抛异常
         * */
        public static void t4(){
            // optional.ofNullable可以兼容空指针, 但是实际传入null后要小心
            Optional<Object> optional = Optional.ofNullable(null);
            // optional.orElseThrow()方法 如果内部引用为空, 则抛异常
            Object object = optional.orElseThrow();
            System.out.println("抛异常=="+object);
        }
    }
    
  • 输出结果如下:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django网文论坛管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

torchnet简介

前言 最近项目开发过程中遇到了torchnet.metertorchnet.metertorchnet.meter来记录模型信息&#xff0c;搜了好多篇博客&#xff0c;都潦草草没有一点干货。于是参考了官方文档以及参考代码&#xff0c;根据自己的理解&#xff0c;在此做了一个其的使用教程&#xff1a; torc…

flink1.13.2 Streaming File Sink产生大量orc小文件的问题解决方案

Orc小文件合并问题 Orc小文件合并问题 现象:hdfs中出现大量ORC小文件 1.1. 已经映射为hive表ORC小文件合并 1.1.1. 非分区表 alter table 表名 concatenate; 示例: alter table ods_lxy_demo concatenate; 注意:可多次重复执行,每执行一次就会做一次文件合并,执行多次最终…

gitee/github上传远程仓库错误usage: git remote add [<options>] <name> <url>

gitee/github上传远程仓库错误gitee/github上传远程仓库错误错误截图版本错误出现时间错误检查及解决1.网址中含有空格2.关闭翻译软件3.git bash自身问题gitee/github上传远程仓库错误 不知道大家最近有没有碰到这个错误usage: git remote add [<options>] <name>…

[附源码]计算机毕业设计JAVA疫情防控期间网上教学管理

[附源码]计算机毕业设计JAVA疫情防控期间网上教学管理 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

Uniapp云开发(Uniapp入门)

前言&#xff1a; 今天这篇文章主要讲解的是Uniapp云开发基础&#xff0c;有了Uniapp云开发&#xff0c;我们就不用需要后端&#xff0c;前端自己就可以实现增删改查。还有就是案例很重要&#xff0c;一定要看&#xff0c;自己去尝试运行试试。 目录超详细一. 什么是Uniapp云开…

分布式配置中心Apollo

Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性&#xff0c;适用于微服务配置管理场景。 服务…

【Python百日进阶-数据分析】Day326 - plotly.express.scatter_geo():地理散点图

文章目录一、scatter_geo语法二、参数三、返回类型四、实例4.1 常规地理散点图4.2自定义地理散点图4.3GeoPandas 的基本示例一、scatter_geo语法 plotly.express.scatter_geo(data_frame None ,lat None ,lon None ,locations None ,locationmode None ,geojson None , …

MuziDB数据库-0.项目描述

前言 该项目写完也有一段时间了&#xff0c;为了避免以后忘记该项目的一些实现的原理&#xff0c;所以写下这篇博客来记录一下该项目的设计等 项目整体 MuziDB分为前端与后端&#xff0c;前后端交互通过socket进行交互&#xff0c;前端的作用就是读取用户输入并发送到后端进…

mybatis开发要点-insert主键ID获取和多参数传递

1.2、代码示例 二、查询如何传入多个参数 1、使用map传递参数&#xff1b; 2、使用注解传递参数&#xff1b; 3、使用Java Bean的方式传递参数&#xff1b; 一、插入数据主键ID获取 一般我们在做业务开发时&#xff0c;经常会遇到插入一条数据并使用到插入数据的ID情况。如…

网络安全事件应急演练方案

文章目录1 总则1.1 应急演练定义1.2 应急演练目的1.3 应急演练原则1.4 应急演练分类1.4.1 按组织形式划分1.4.2 按内容划分1.4.3 按目的与作用划分1.4.4 按组织范围划分1.5 应急演练规划2 应急演练组织机构2.1 组织单位2.1.1 领导小组2.1.2 策划小组2.1.3 保障小组2.1.4 评估小…

jvm参数造成http请求Read time out

问题描述 线上部署的代码&#xff0c;部署在测试环境突然抛出接口请求Read time out的异常。查看线上日志&#xff0c;接口请求正常。重新启动&#xff0c;部署测试环境代码都没有效果&#xff0c;接口还是必现Read time out。 原因分析&#xff1a; 1. 排查网络原因 直接在…

内核开发-同步场景与概念

进程上下文执行环境还有中断上下文执行环境&#xff0c;并且中断上下文优先级比较高&#xff0c;可以随时打断进程的执行&#xff0c;因此情况更加复杂。内核当中提供了不同的同步机制。比如说信号量&#xff0c;自旋锁&#xff0c;rcu&#xff0c;原子变量等等。他们各自都有自…

《计算机视觉技术与应用》-----第六章 直方图

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

软件过程模型

软件过程软件过程:获得高质量软件的一系列任务框架瀑布模型:特点:顺序,依赖,推迟实现,质量保证优点:规范方法,规定文档,阶段质量验证缺点:开发初期困难,需求验证困难,难以维护快速原型优点:满足需求,线性过程缺点:设计困难,原型理解不同,不利于创新增量模型:优点:短时间可完成部…

[附源码]Python计算机毕业设计SSM健身房管理系统设计(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]Python计算机毕业设计Django体育馆场地预约管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

VSCode 配置C语言环境 全程记录 ,配置成功

目录 1.vscode介绍&#xff1a; 1.1 卸载干净VSCode 1.2安装VSCode 1.2.1 下载安装 1.2.2 vscode 小插件安装 2. 配置vscode 编译器 2.1 下载编译器资源文件&#xff1a; 2.2 配置环境变量 2.3 vscode项目文件配置 1. 首先新建一个.c文件&#xff0c;命名为英文哦 2. 然后…

含有DBCO和马来酰亚胺基团Mal-PEG2-DBCO,2698339-31-8,DBCO-PEG2-Maleimide

中英文别名&#xff1a; CAS号&#xff1a;2698339-31-8 | 英文名&#xff1a;DBCO-PEG2-Maleimide&#xff0c;Mal-PEG2-DBCO |中文名&#xff1a;二苯并环辛炔-二聚乙二醇-马来酰亚胺物理参数&#xff1a; CASNumber&#xff1a;2698339-31-8 Molecular formula&#xff1a;C…

工业和信息化部公布45个国家先进制造业集群名单

近日&#xff0c;工业和信息化部正式公布45个国家先进制造业集群的名单。 45个国家级集群2021年主导产业产值达19万亿元&#xff0c;布局建设了18家国家制造业创新中心&#xff0c;占全部国家级创新中心数量的70%&#xff0c;拥有国家级技术创新载体1700余家&#xff0c;培育创…