在Java 9中,在Set接口(称为of() )上引入了新的静态工厂方法,它接受多个元素,甚至接受一个元素数组。
我希望将一个列表转换为一个集合,以删除集合中的任何重复条目,这些操作可以使用以下方法完成(在Java 9之前):
Set<String> set = new HashSet<>();
set.addAll(list);但是,我认为使用这个新的Java 9静态工厂方法做:
Set.of(list.toArray())其中list是以前定义的字符串列表。
但是遗憾的是,当元素是重复的时,java抛出了一个IllegalArgumentException,这在方法的Javadoc中也有说明。为什么会这样呢?
编辑:这个问题不是关于一个概念上相同的主题Map.of()方法的另一个问题的重复,而是明显不同的问题。并非所有()方法的静态工厂的行为都是相同的。换句话说,当我询问有关Set.of()方法的内容时,我不会单击处理Map.of()方法的问题。
发布于 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:
Set<String> set = new HashSet<>(list);它在Java 9之前就已经可用了。
发布于 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方法没有提供任何性能优势,但这可以很容易地更改(但是不确定延迟是什么)。
发布于 2017-12-04 09:02:21
你认为这将是一个“最后的胜利”,就像我想的HashSet一样,但这是一个深思熟虑的决定(斯图亚特马克-这些的创建者)。他甚至有这样一个例子:
Map.ofEntries(
"!", "Eclamation"
.... // lots of other entries
""
"|", "VERTICAL_BAR"
);选择是,由于这可能容易出错,他们应该禁止它。
还请注意,Set.of()返回一个不可变的Set,因此您可以将Set封装到:
Collections.unmodifiableCollection(new HashSet<>(list))https://stackoverflow.com/questions/47629595
复制相似问题