【双语】Java9 新特性:不可变集合 Immutable Collections

本贴最后更新于 2480 天前,其中的信息可能已经斗转星移

摘要: Java 9 支持了不可变的 List,Set 和 Map 集合,这里就介绍一下这几个不可变集合的使用方法,和如何来简单的得到他们的交集和并集。

英文原文链接:https://www.javaspecialists.eu/archive/Issue248.html

Exciting news. We now have "immutable collections" in Java 9. Just like Scala (not really).

这真是一个令人兴奋的消息,Java 9 像 Scala 一样支持了不可变集合.

For example, if we want to create lists, we can do this:

举个例子,如果我们想创建一个不可变 list,我们可以像如下这么做:

List<Integer> list0 =  List.of();  _// List0_  
List<Integer> list1 =  List.of(42);  _// List1_  
List<Integer> list2 =  List.of(42,  57);  _// List2_  
List<Integer> list3 =  List.of(42,  57,  1);  _// ListN_  
List<Integer> list4 =  List.of(42,  57,  1,  2);  _// ListN_

Someone pointed out that the lists returned by Arrays.asList() were also immutable. They are not. Whilst you cannot add and remove elements, you can still set individual elements of the list.

有人说数组用 Arrays.asList()转换成 list 时不也是不可变集合吗?答案是否定的,list 依然可以添加和删除元素。

We can create sets in a similar way, like so:

我们可以用类似的方法创建 Set 集合:

Set<Integer> set0 =  Set.of();  _// List0_  
Set<Integer> set1 =  Set.of(42);  _// List1_  
Set<Integer> set2 =  Set.of(42,  57);  _// List2_  
Set<Integer> set3 =  Set.of(42,  57,  1);  _// ListN_  
Set<Integer> set4 =  Set.of(42,  57,  1,  2);  _// ListN_

This begs the question: How can we do set operations? Let's take these sets:

这就引出了一个问题:我们怎么操作这些集合?先让我们创建两个 Set 不可变集合:

Set<Integer> one =  Set.of(1,  2,  3);  
Set<Integer> two =  Set.of(3,  4,  5);

To create a union of these is a bit awkward, since there is no easy way to create an immutable Set from an ordinary Set. We could create a temporary Set and then the union from that, like so:

挺尴尬的我们没有一个简单的方法来实现得到两个不可变集合并集的效果,我们可以创建一个临时集合来达到目的:

Set<Integer> temp =  new  HashSet<>(one); 
temp.addAll(two);  
Set<Integer>  union  =  Set.of(temp.toArray(new  Integer[0])); 
System.out.println("union = " +  union);

I do not like temporary variables, so we could wrap this in a facade somewhere. To do the intersection is similar:

我并不是很喜欢临时变量,或许我们可以写一个方法来封装这个操作,当然获得交集的方式也类似:

Set<Integer> temp =  new  HashSet<>(one); 
temp.retainAll(two); 
Set<Integer> intersection =  Set.of(temp.toArray(new  Integer[0]));
System.out.println("intersection = "  + intersection);

We can also create Maps with Map.of():

我们创建 Map 不可变集合也是类似的方法:

Map<String,  Integer> map0 =  Map.of();  
Map<String,  Integer> map1 =  Map.of("one",  1); 
Map<String,  Integer> map2 =  Map.of("one",  1,  "two",  2);

Map.of() works with key and value pairs up to 10 entries. Beyond that, we need to pass in a var-args of Entry instances and use Map.ofEntries(Entry...)

Map.of()最多只能放进 10 个键值对,如果想放入更多的键值对,我们需要用到传入实体参数的方式来创建不可变集合:

Map<String,  Integer> mapN =  Map.ofEntries(Map.entry("one",  1),  
	Map.entry("two",  2), 
	Map.entry("three",  3),  
	Map.entry("four",  4),  
	Map.entry("five",  5));
	

It is, of course, not nearly as convenient as Kotlin/Swift/Scala/Groovy/etc. It's a very small addition to Java which you get when you go over to Java 9.

当然了,java 的不可变集合使用上还是不如 Kotlin/Switf/Scala/Groovy/等等那么简单,他只是一个 Java9 所有新功能中的一小部分。

Kind regards from Crete

Heinz

英文原文链接:https://www.javaspecialists.eu/archive/Issue248.html

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    567 引用 • 3532 回帖
  • 双语
    2 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 倾城之链
    23 引用 • 66 回帖 • 137 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 545 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 453 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 2 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 587 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 283 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    90 引用 • 899 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 325 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 432 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 786 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 167 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 624 关注
  • 创业

    你比 99% 的人都优秀么?

    84 引用 • 1399 回帖 • 1 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 47 关注