介绍

Oracle 在2017年3月左右发布Java新版本:Java SE9。陆续我会发表一系列有关Java SE 9新功能的文章。这是本系列的第三篇。

我已经发表了几篇有关Java SE 9新特性的文章。在阅读这篇文章之前,请先阅读以下文章:

在本文中,我会带着大家一起来讨论一下Java SE 9新功能:Immutable List的 工厂方,在讲解的过程中会穿插一些简单而合适的示例。

Java SE 8: 空的不可变列表

在Java SE 8和更早版本中,如果我们要创建一个空的不可变或不可修改的列表,则应该使用Collections类提供的静态方法:unmodifiableList(),如下所示:

List emptyList = new ArrayList<>();

List immutableList = Collections.unmodifiableList(emptyList);

注意:<> 操作符在Java SE 6和早期版本中不起作用,其余代码在所有Java版本中通用。

我们在REPL中测试上述代码:

➜ ~ jshell

| Welcome to JShell -- Version 11.0.5

| For an introduction type: /help intro

jshell> List emptyList = new ArrayList<>();

emptyList ==> []

jshell> List immutableList = Collections.unmodifiableList(emptyList);

immutableList ==> []

jshell>

正如上面操作的那样,创建一个空的不可变列表,我们需要做很多事情。一个简单的事情竟是如此的繁琐和冗长。现在让我们在Java SE 9中看看该如何操作。

注意:-为了简便和快速的验证功能,我使用Java SE 9 REPL(JShell)。这就是为什么需要各种语言使用REPL来快速测试新功能而无需做很多工作的原因,Java 也不例外。

Java SE 9: 空的不可变列表

为了克服这些缺点,Java SE 9在List接口中引入了两个有用的方法,因此我们不需要再使用如此繁琐的步骤来创建不可变的空列表了。

通过Java SE 9 List API,我们可以在List接口中找到以下方法签名。

static List of()

它用于创建一个空的不可变列表(具有零个元素的列表)。

List immutableList = List.of();

我们在在REPL中测试上述代码:

➜ ~ jshell

| Welcome to JShell -- Version 11.0.5

| For an introduction type: /help intro

jshell> List immutableList = List.of();

immutableList ==> []

jshell>

我们可以看到,在Java SE 9中创建一个空的不可变列表非常容易。

Java SE 8:非空不可变列表

现在,让我们来看看如何在Java SE 8和更早版本中创建非空不可变列表。

List list = new ArrayList<>();

list.add("one");

list.add("two");

list.add("three");

List immutableList = Collections.unmodifiableList(list);

在这里,我们还可以观察到,要创建一个非空的不可变列表,我们需要做很多事情以及非常繁琐和冗长的步骤。现在让我们在Java SE 9中看看做同样的事情该如何操作。

Java SE 9:非空不可变列表

为了克服上述的这些缺点,Java SE 9引入了以下几个重载方法。这些方法用于创建1-10个不等元素新的不可变列表。

static List of(E e1)

static List of(E e1,E e2)

static List of(E e1,E e2,E e3)

static List of(E e1,E e2,E e3,E e4)

static List of(E e1,E e2,E e3,E e4,E e5)

static List of(E e1,E e2,E e3,E e4,E e5,E e6)

static List of(E e1,E e2,E e3,E e4,E e5,E e6,E e7)

static List of(E e1,E e2,E e3,E e4,E e5,E e6,E e7,E e8)

static List of(E e1,E e2,E e3,E e4,E e5,E e6,E e7,E e8,E e9)

static List of(E e1,E e2,E e3,E e4,E e5,E e6,E e7,E e8,E e9,E e10)

以下是Var-Args方法(可变参数方法):

static List of(E... elements)

示例:

List immutableList = List.of("one","two","three");

哈哈,是不是非常简单~

我们在在REPL中测试上述代码:

jshell> List immutableList = List.of("one","two","three")

immutableList ==> [one, two, three]

不可变列表的特征

我们都知道,不可变列表是不可修改的。在本节中,我们将讨论不可变列表的一些基本特征(在所有Java版本中都一样):

它们是不可变的。

我们无法添加,修改和删除其内部的元素。

如果尝试对它们执行添加/删除/更新操作,则会得到UnsupportedOperationException,如下所示:

jshell> immutableList.add("four")

| java.lang.UnsupportedOperationException thrown:

| at ImmutableCollections.uoe (ImmutableCollections.java:68)

| at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:74)

| at (#2:1)

```

不允许有空元素(null)

如果试图使用null元素创建它们,则会抛出NullPointerException,如下所示:

jshell> List>String> immutableList = List.of("one","two","three", null)

| Error:

| cannot find symbol

| symbol: variable List

| List>String> immutableList = List.of("one","two","three", null)

| ^--^

| Error:

| cannot find symbol

| symbol: variable String

| List>String> immutableList = List.of("one","two","three", null)

| ^----^

jshell>

如果试图添加null元素,则会抛出UnsupportedOperationException,如下所示:

jshell> immutableList.add(null)

| Exception java.lang.UnsupportedOperationException

| at ImmutableCollections.uoe (ImmutableCollections.java:71)

| at ImmutableCollections$AbstractImmutableCollection.add (ImmutableCollections.java:75)

| at (#2:1)

jshell>

如果 List里面所有元素都是可序列化的,则它们是可序列化的。

就是Java SE 9:不可变列表的工厂方法的一些特性。我们将在以后的文章中讨论更多关于Java SE 9的新功能。

java immutable_Java 9:Immutable List的工厂方法详解相关推荐

  1. Java 静态工厂方法详解

    Java 静态工厂方法详解 本文章主要是对<Effective Java>对静态工厂方法的理解 第一次使用静态工厂方法是在HIT<Software Construction>课 ...

  2. java kaptcha_java相关:kaptcha验证码使用方法详解

    java相关:kaptcha验证码使用方法详解 发布于 2020-6-7| 复制链接 摘记: 本文为大家分享了kaptcha验证码的使用方法,供大家参考,具体内容如下1.首先在pom.xml文件中导入 ...

  3. eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...

  4. Java SHA-256加密的两种实现方法详解

    利用Apache的工具类实现加密,使用commons-codec包中的DigestUtils算法工具类(入参支持字符串.字节数组.文件流等): maven: 1 2 3 4 5 <depende ...

  5. JAVA 静态变量,静态方法,main方法详解(韩顺平)

    目录 一.类变量 1.类变量的引入 2.类变量的定义 3.类变量的特点 4.如何定义类变量 5.如何访问类变量 6.类变量使用细节 二.类方法 1.基本介绍 2.定义类方法 3.类方法的访问 4.类方 ...

  6. java 注解的几大作用及使用方法详解(转载)

    ava 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注 ...

  7. android java 指针异常处理,Android自定义抛出异常的方法详解

    前言 在android开发过程中,我们经常遇到异常的问题,崩溃抛出异常的时候,是非常令人烦闷的.但是异常有一个好处,使得app能在编译的时候给我们提供一些bug信息,有时可能比较模糊,有时可能很精准, ...

  8. java的remove iterator_Java集合 iterator.remove()方法详解

    直接上代码: public classtest {public static voidmain(String[] args) { List list = new ArrayList<>() ...

  9. java js倒计时_Java实现倒计时的方法详解

    这篇文章主要介绍了Java编程倒计时实现的三个示例,三种实现方法,具有一定参考价值,需要的朋友可以了解下. 实现Java编程中倒计时的方法有许多,下面我们通过三个示例来简单了解下它的实现过程. 1.简 ...

最新文章

  1. Redis 笔记(04)— list类型(作为消息队列使用、在列表头部添加元素、尾部删除元素、查看列表长度、遍历指定列表区间元素、获取指定区间列表元素、阻塞式获取列表元素)
  2. 直流UPS与传统UPS系统节能分析
  3. 【必看】这6个吓人的Linux命令,你用过吗?
  4. Intellj idea启动tomcat配置
  5. MATLAB机器学习系列-12:蚁群算法优化原理及其matlab实现
  6. dart系列之:dart类中的泛型
  7. CentOS 7.2安装Jenkins自动构建Git项目
  8. MA5680T OLT管理软件,全智能判断板卡,无人值守策略,根据光猫类型自动扫描添加光猫...
  9. JavaScriptDOM
  10. 一个相当好的状态机(DFA, 确定有限状态机)的编码实现,相当简洁漂亮
  11. python映射的主要特点_30 个 Python 语言的特点技巧
  12. 在less中不能正常使用css3的calc属性的解决方法
  13. PDF Expert 坚果云 强强联合 优惠来袭
  14. LVDS转RGB,国产视频解码芯片,GM8284DD,替代LT8218A
  15. android opencv hu 不变矩,图像的矩(含hu不变矩)
  16. 老男孩之《生日快乐》
  17. 城乡规划设和计算机应用,城乡规划行业未来展望
  18. matlab的gccphat转C语言,Python中的GCCPHAT互相关
  19. 北山白云里,隐者自怡悦。
  20. 【阅读总结】ROSE: A Retinal OCT-Angiography Vessel Segmentation Dataset and New Model

热门文章

  1. 每周算法讲堂,二分法
  2. 页面出现错误提示状态码所代表的含义
  3. vue-element-admin 简单实现仿淘宝实现商品图片放大镜效果
  4. Error: error:0308010C:digital envelope routines::unsupported(Vue2项目报错)
  5. Qt中QVector赋值速度与数组赋值速度的测试比较
  6. Android应用生死轮回的那些事儿(4) - 武器库(2)-应用组件查询相关API
  7. iphone X 越狱笔记
  8. 乐山农行机器人_闪亮登场!农行黔江分行智能机器人为你服务
  9. 微信怎么在个人信息里关掉朋友圈的入口?
  10. 计算1到100自然数之和(用while语句)