首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果元素是重复的,为什么Set.of()抛出一个IllegalArgumentException?

如果元素是重复的,为什么Set.of()抛出一个IllegalArgumentException?
EN

Stack Overflow用户
提问于 2017-12-04 08:52:58
回答 6查看 3.8K关注 0票数 23

在Java 9中,在Set接口(称为of() )上引入了新的静态工厂方法,它接受多个元素,甚至接受一个元素数组。

我希望将一个列表转换为一个集合,以删除集合中的任何重复条目,这些操作可以使用以下方法完成(在Java 9之前):

代码语言:javascript
复制
Set<String> set = new HashSet<>();
set.addAll(list);

但是,我认为使用这个新的Java 9静态工厂方法做:

代码语言:javascript
复制
Set.of(list.toArray())

其中list是以前定义的字符串列表。

但是遗憾的是,当元素是重复的时,java抛出了一个IllegalArgumentException,这在方法的Javadoc中也有说明。为什么会这样呢?

编辑:这个问题不是关于一个概念上相同的主题Map.of()方法的另一个问题的重复,而是明显不同的问题。并非所有()方法的静态工厂的行为都是相同的。换句话说,当我询问有关Set.of()方法的内容时,我不会单击处理Map.of()方法的问题。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-12-04 09:06:00

Set.of()工厂方法为给定元素数的生成不可变的Set

在支持固定数量的参数的变体中(static <E> Set<E> of​()static <E> Set<E> of​(E e1)static <E> Set<E> of​(E e1,E e2)等)不具有重复项的要求更容易理解--当您调用方法Set.of(a,b,c)时,您表示希望创建一个不变的Set of ,确切地说是3元素,因此如果参数包含重复项,则拒绝输入而不是生成更小的Set是有意义的。

虽然Set<E> of​(E... elements)变量是不同的(如果允许创建任意数量的元素的Set ),它遵循其他变量的相同逻辑。如果将n元素传递给该方法,则说明您希望创建一个不可变的Set of ,确切地说是 n元素,因此不允许重复。

您仍然可以使用以下方法从一行中的一个Set (具有潜在的重复项)创建一个List

代码语言:javascript
复制
Set<String> set = new HashSet<>(list);

它在Java 9之前就已经可用了。

票数 20
EN

Stack Overflow用户

发布于 2017-12-04 09:00:55

Set.of()是手动创建小型Set的一种简单方法。在这种情况下,如果您给出重复的值,这将是一个公然的编程错误,因为您应该自己写出元素。也就是说,Set.of("foo", "bar", "baz", "foo");显然是程序员的一个错误。

你冷静的方式其实是个很糟糕的方法。如果要将List转换为Set,可以使用Set<Foo> foo = new HashSet<>(myList);或任何其他您希望的方式(例如使用流和收集toSet())来完成。优点包括不使用无用的toArray(),选择自己的Set (您可能希望LinkedHashSet保持顺序)等等。缺点包括必须键入更多的代码字符。

Set.of()List.of()Map.of()方法背后的最初设计思想(以及它们的大量重载)在这里解释了Java 9中的集合重载方便工厂方法的意义是什么?这里,其中提到了关注的焦点是小型集合,这在内部API中非常常见,因此可以具有性能优势。尽管当前的方法委托给varargs方法没有提供任何性能优势,但这可以很容易地更改(但是不确定延迟是什么)。

票数 26
EN

Stack Overflow用户

发布于 2017-12-04 09:02:21

你认为这将是一个“最后的胜利”,就像我想的HashSet一样,但这是一个深思熟虑的决定(斯图亚特马克-这些的创建者)。他甚至有这样一个例子:

代码语言:javascript
复制
Map.ofEntries(
   "!", "Eclamation"
   .... // lots of other entries
   ""
   "|", "VERTICAL_BAR"
);

选择是,由于这可能容易出错,他们应该禁止它。

还请注意,Set.of()返回一个不可变的Set,因此您可以将Set封装到:

代码语言:javascript
复制
Collections.unmodifiableCollection(new HashSet<>(list))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47629595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档