我想创建一个用于测试目的的选项列表.起初,我这样做了:
ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");
Run Code Online (Sandbox Code Playgroud)
然后我重构代码如下:
ArrayList<String> places = new ArrayList<String>(
Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我需要创建一个Set初始值.
Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");
Run Code Online (Sandbox Code Playgroud)
有没有办法在一行代码中执行此操作?例如,它对最终的静态字段很有用.
我只是看着番石榴ImmutableList,我注意到这个of()方法超载了12次.
在我看来,他们所需要的只是:
static <E> ImmutableList<E> of();
static <E> ImmutableList<E> of(E element); // not even necessary
static <E> ImmutableList<E> of(E... elements);
Run Code Online (Sandbox Code Playgroud)
有这么多类似变化的原因是什么?
在浏览EnumSet<E> of方法时,我看到了多个of方法的重载实现:
public static <E extends Enum<E>> EnumSet<E> of(E e)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)
.
.
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
Run Code Online (Sandbox Code Playgroud)
然后用另一个重载方法 varargs
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
EnumSet<E> result = noneOf(first.getDeclaringClass());
result.add(first);
for (E e : rest)
result.add(e);
return result;
}
Run Code Online (Sandbox Code Playgroud)
当这个varargs可以处理其他实现时,为什么这个方法会以这种方式重载?这有什么具体原因吗?
我曾经历过同样的Javadoc,但我找不到任何令人信服的解释.
我正在研究Immutable收藏的工厂方法.我看到该Set.of()方法有10个varargs重载(相同Map.of()).我真的不明白为什么会这么多.最后,ImmutableCollections.SetN<>(elements)无论如何都会调用该函数.
在文档中我发现了这个:
虽然这会在API中引入一些混乱,但它避免了varargs调用引起的数组分配,初始化和垃圾收集开销.
杂乱的确是值得的性能提升吗?如果是,理想情况下是否会为任何N元素创建单独的方法?
在Java 9中,在Set接口上引入了新的静态工厂方法,称为of(),它接受多个元素,甚至是一个元素数组.
我想将一个列表转换为一个集合,以删除集合中的任何重复条目,这可以通过以下方式完成(在Java 9之前):
Set<String> set = new HashSet<>();
set.addAll(list);
Run Code Online (Sandbox Code Playgroud)
但是我认为使用这个新的Java 9静态工厂方法会很酷:
Set.of(list.toArray())
Run Code Online (Sandbox Code Playgroud)
其中list是先前定义的字符串列表.
但是,唉,java扔了一个IllegalArgumentException元素重复的时候,也在方法的Javadoc中说明了.为什么是这样?
编辑:这个问题不是关于概念上等效主题的另一个问题的重复,Map.of()方法,但明显不同.并非所有()方法的静态工厂都表现相同.换句话说,当我问一些关于Set.of()方法的东西时,我不会点击处理Map.of()方法的问题.
从Map.java的文档-
在
Map.of()和Map.ofEntries()静态工厂方法提供了一种方便的方法来创建不可改变的地图.
但是当我已经可以使用重载方法时 ......
Map.of("k1","v1","k2","v2","k3","v3"...);
Run Code Online (Sandbox Code Playgroud)
... Map.ofEntries的用途是什么呢?
返回包含从给定条目中提取的键和值的不可变映射,并且条目本身不存储在映射中.
java ×7
collections ×5
java-9 ×3
arraylist ×1
constructor ×1
enumset ×1
guava ×1
hashmap ×1
hashset ×1
overloading ×1
set ×1