在Java 9中,在Set接口上引入了称为of()的新静态工厂方法,该方法接受多个元素,甚至是元素数组。
我想将一个列表变成一个集合,以删除集合中的所有重复条目,这可以使用以下方法完成(在Java 9之前):
Set<String> set = new HashSet<>();
set.addAll(list);
但是我认为使用这种新的Java 9静态工厂方法很酷:
Set.of(list.toArray())
其中list
是先前定义的字符串列表。
但是,可惜的是,IllegalArgumentException
当元素重复时,java抛出了一个,该方法的Javadoc中也对此做了说明。为什么是这样?
编辑
:此问题不是有关概念上等效的主题Map.of()方法的另一个问题的重复,但有明显不同。并非所有静态工厂of()方法的行为都相同。换句话说,当我询问有关Set.of()方法的问题时,我不会单击涉及Map.of()方法的问题。
对于 给定* 数量的元素,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
的 正是
3个要素,因此,如果参数包含重复项,则拒绝输入而不是产生较小的有意义Set
。
尽管Set<E> of(E... elements)
变体不同(如果允许创建Set
任意数量的元素),则其遵循与其他变体相同的逻辑。如果将n
元素传递给该方法,则说明您希望创建一个不可变Set
的
精确 n
元素,因此不允许重复。
您仍然可以使用以下内容Set
在一个内联代码中List
(有可能重复)创建一个:
Set<String> set = new HashSet<>(list);
在Java 9之前已经可用。
为什么会抛出一个? 中的第一项是,这是一个完全可以接受的值。此外,返回一个可选值,这对于能够处理s更有意义。 编辑:更新以减少歧义。
我曾经认为移除for-loop中的元素总是会导致ConcurrentModificationException,但我可能错了。你们能告诉我是什么造成了这里的差异吗。我在Corretto11上运行代码。
如果我在锚元素中放置div元素,它会使我的超文本标记语言无效。 不在内联元素中放置块级元素的原因是什么?
gameStart是一个全局变量,初始值为false。通常,当我点击左、右、上或下按钮时,gameStart变量设置为true,但if(gameStart)不起作用。但是当我用注释的块减慢速度时,if(gameStart)运行正常。为什么会发生这种情况?
我正在尝试从跨域服务器检索图像。我在WAMP堆栈服务器上使用自签名证书,但无论我使用哪种标头,get ch()总是在飞行前检查后抛出异常。以下是取自Chrome的请求/响应标头: 这是调用get ch()的javascript代码: 以下是图像所在目录中 .htaccess 的标头: 我已经为此工作了好几天。我什至尝试过在 apache 配置文件中使用 RewriteRule 指令强制使用 htt
我正在研究集合的工厂方法。我看到方法有10个varargs重载(与相同)。我真的不明白为什么有这么多。最后,函数