Java 9示例–收集的工厂方法–创建不可修改的列表,集合和映射

大家好,这是我在该博客上发表的有关Java 9功能的第一篇文章,今天您将了解我最喜欢的功能“收集的工厂方法” ,它是JEP 269的一部分。JEP代表JDK增强建议。 如果您曾经在GroovyKotlin工作过,那么您就会知道使用集合文字使用元素创建列表很容易,例如,创建1、2、3的列表,您只需编写val items = listOf(1, 2, 3) 。 不幸的是,Java尚不支持它,但是JDK 9中的工厂收集方法已经改进了一切,并且几乎就是这样。 JDK在基本的Collection接口上添加了诸如of()of() 静态工厂方法 ,您可以使用它们来创建项目列表。

尽管Project Jigsaw或Java Module系统是Java 9发行版的主要亮点,但从开发的角度来看,还有其他一些有用的功能更有用,例如流程API附魔,Stream API增强以及Optional类的一些有用方法,但是我最喜欢的API更改是Collection的工厂方法。

就像在KotlinScalaGroovy中一样,它允许您在一行中创建值的列表,集合和值的映射:

List<String> list = List.of("Java", "Kotlin", "Groovy");

但是,唯一要注意的是您可以创建不可修改或不可变的 List,Set或Map。

of()静态工厂方法返回的List,Set或Map在结构上是不可变的,这意味着一旦添加,就不能添加,删除或更改元素。

调用任何mutator方法将始终导致抛出UnsupportedOperationException 。 但是,如果所包含的元素本身是可变的,则可能导致Collection的行为不一致或它的内容似乎发生变化。

这与您在JDK 6或7中创建的不可修改列表相同,如下所示:

List<String> listOfString = new List<>();
listOfString.add("Java");
listOfString.add("Kotlin");
listOfString.add("Groovy");
listOfString.add("Scala");
listOfString = Collections.unmodifiableList(listOfString);

unmodifiableList()方法返回的列表也不支持添加,删除或设置操作,如果调用它们,则抛出UnsupportedOperationException

两种代码之间的唯一区别是,更早的代码需要6行以上的代码才能创建不可变的Collection,例如不可变的List,Set或Map,但是现在您只需一行即可。

List接口上还有List.of()多个重载版本,例如,允许您创建1到10个元素的不可变列表,以及允许您创建任意数量的元素的可变参数方法

Set.of( )和Map.of()方法也是如此。 这是在Java 9中创建不可变Set的示例:

Set<Integer> primes = Set.of(2,3,5,7);

您会看到您可以在一行中创建一个不可变的Set。 同样,要创建不可变Map,JDK 9提供了两种方法Map.of(K k1, V v1)Map.ofEntries()通过使用这两种方法,您可以创建不可变条目的Map,例如

重载此方法可以创建最多10个键值对的映射,但是如果您需要更大的映射和更多的映射,则应使用Map.ofEntries()方法。

顺便说一句,您知道如何实现此功能吗? 为何以前不可用? 如果查看JDK 9代码或Javadoc,则会发现此功能是通过在Java Collection框架的关键接口(例如List,Set和Map)上添加静态工厂方法来实现的。

在JDK 8之前这是不可能的,因为在接口上添加方法意味着破坏所有客户端,并且接口上不允许使用静态方法。 在Java 8上,事情发生了变化,在接口上引入了默认静态方法 ,这为评估JDK API铺平了道路。

我希望将来会有更多类似的约定,使使用JDK API更加容易。

同样,使用这些工厂方法时,适用于使用不同集合的规则也将适用(正如您期望的那样)。 因此,创建Set时不能传递重复元素,因为Set不允许重复

同样,创建Map时不能传递重复键,因为Map不允许重复键。 如果这样做,则将IllegalArgumentException

同样,您不能将null值传递给collection factory方法,如果这样做,请为Java异常NullPointerException做好准备。

这就是如何在Java 9中创建不可变的列表,设置和映射的全部内容。 集合上的静态方法确实使使用Java集合API变得更容易,至少现在它类似于Kotlin或Groovy提供的东西。 JDK 9充满了这样有用的功能,请继续关注此博客上的更多此类文章。

您可能喜欢的其他Java和编程文章

感谢您到目前为止阅读本文。 如果您喜欢此Java 9功能,请与您的朋友和同事分享。 如果您有任何问题需要反馈,请留下注释。

翻译自: https://www.javacodegeeks.com/2018/02/java-9-example-factory-methods-collection-creating-unmodifiable-list-set-map.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值