Java 9:Immutable Set的工厂方法详解

介绍

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

我已经发表了几篇有关Java SE 9新功能的文章。 在阅读这篇文章之前,请阅读它们。 这篇文章是 Java SE 9:Immutable List的工厂方法详解的延续。

在本文中,我将带着大家一起来讨论一下Java SE 9新功能:Immutable Set的工厂方法详解,并提供一些简单而合适的示例。

Java SE 8:空的不可变集合

在Java SE 8和更早版本中,如果我们要创建一个空的ImmutableUnmodifiable Set,则可以使用Collections类提供的静态方法:unmodifiableSet,如下所示:

 Set<String> emptySet = new HashSet<>();
 Set<String> immutableSet = Collections.unmodifiableSet(emptySet);

上述,我们可以看到创建一个简单的空集合是如此的繁琐且冗长。现在让我们在Java SE 9中看看该如何操作。

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

Java SE 9:空的不可变集合

为了克服上述的这些缺点,Java SE 9在Set接口中引入了两个有用的方法,这样我们不需要使用这些繁琐的步骤来创建空的不可变集合。

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

 static <E> Set<E> of()

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

 Set<String> immutableSet = Set.of();

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

Java SE 8:非空的不可变集合

在本节中,我们将看到如何在Java SE 8和更早版本中创建不可变的非空集合。我们可以使用Collections类中的unmodifiableable方法创建一个不可变的非空集合,如下所示:

 Set<String> nonemptySet = new HashSet<>();
 nonemptySet.add("one");
 nonemptySet.add("two");
 nonemptySet.add("three");
 Set<String> immutableSet = Collections.unmodifiableSet(nonemptySet);

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

下面我们再来看看在Java SE 9 中是如何操作的。

Java SE 9:非空的不可变集合

在本节中,我们可以看到如何在Java SE 9版本中创建不可变的非空集合。通过查阅Java SE 9 Set Interface API,我们可以看到一组重载方法,如下所示:

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

例子:

 Set<String> immutableSet = Set.of("one","two","three");

创建一个不可变的非空集合非常简单。

让我们在Java SE 9 REPL中测试一下以上代码:

jshell> Set<String> immutableSet = Set.of("one","two","three")
immutableSet ==> [one, two, three]

在这里我们可以看到,在Java SE 9中创建非空不可变集合是如此的容易。

Java SE 9:变长参数的不可变集合

Oracle引入了另一种具有变长参数的Set.of()方法。以下是用于在Java SE 9中创建非空不可变集合的Var-Args方法

static <E> Set<E> of(E... elements)  

它主要用来创建带有元素数组的不可变集合,如下所示:

 String[] nameArr =  { "one", "two", "three"};
 Set<String[]> set= Set.<String[]>of(nameArr);

下面,我们在Java REPL 看一下执行的结果:

jshell> String[] nameArr =  { "one", "two", "three"}
nameArr ==> String[3] { "one", "two", "three" }

jshell> Set<String[]> set = Set.<String[]>of(nameArr);
set ==> [[Ljava.lang.String;@56ef9176]

jshell> set
set ==> [[Ljava.lang.String;@56ef9176]

上述,我们创建了带有字符串元素数组的不可变集合。

不可变集合的特征类似于不可变列表。您可以在这里详细找到这些信息:Java SE 9:Immutable List的工厂方法详解

以上就是Java SE 9:Immutable Set的工厂方法详解的基本信息。我们将在以后的文章中讨论更多Java SE 9新功能。

原文链接:https://www.journaldev.com/12984/javase9-factories-for-immutable-set

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354