有没有比调用Arrays.asList更好的List<T>初始化替代方案?

8
有没有更好的替代方法来使用Arrays.asList作为列表批量初始化器?其中令人担忧的是这种方法冗长,并涉及一个不必要的类和方法。
List<Double> myList = new ArrayList<Double>(Arrays.asList(3.01d, 4.02d, 5.03d));

编辑:本问题涉及批量初始化,通常会有更多的值,而不仅限于示例中的三个值。

这看起来非常好(以及MatrixFrog建议的优化,如果列表将是只读的)。单个方法调用在初始化中不会在性能上有任何影响。 - JimN
6个回答

6
如果你知道以后不需要再往列表中添加任何内容,你可以直接执行以下操作:
List<Double> myList = Arrays.asList(3.01d, 4.02d, 5.03d);

我相信通过Arrays.asList返回的列表可以被修改,但只能更改其中已有的元素--无法向其中添加新元素。


3

使用 guava

List<Double> myList = Lists.newArrayList(3.01d, 4.02d, 5.03d));

2

虽然不完全符合问题,但是如果想要实例化一个List只是为了立即对其中的值进行操作,而不仅仅是为了实例化,那么可以使用Java 8中的Stream.of(T... values),然后通过流API操纵流以从值列表中获取所需的结果。

例如,要获取一系列值的最大值...

int maxValue = Stream.of(10, 5, 25).max(Integer::compareTo).get();

上面的示例还有助于处理多个参数时想要Math.max(#,#)类型功能的情况。


1
谢谢分享。 我认为Stream.of(object).collect(Collectors.toList())是更好的方法。 - Ali Abazari
@AliReza19330 怎么了?看起来你多做了一些不必要的步骤,先收集然后再把值放入列表中。 - Adrian Romanelli
也许我的用例有点不同。在我的用例中,Stream.of(object).collect(Collectors.toList()) 的结果是可变集合,但 Arrays.asList 是不可变的。然而,根据第一个方法的 Java 文档,没有保证其可变性,为了保证可变性,我们应该使用 toCollection - Ali Abazari

2
自Java 9起,您可以使用List.of工厂方法:
static <E> List<E> of​(E... elements)

返回一个包含任意数量元素的不可变列表。

或者使用Guava:

public static <E> ImmutableList<E> of(E e1, E e2,...)

返回一个包含给定元素按顺序排列的不可变列表。

1

另一种选项是作为匿名内部类:

List<Double> myList = new ArrayList() {
{
   add(3.01d);
   add(4.02d);
   add(5.03d);
}
};

我编辑了问题以使得它清晰表明这是批量初始化。 - H2ONaCl

1

是的,你可以这样做:

List<Double> myList = Arrays.asList(new Double[]{3.01d, 4.02d, 5.03d});
// or
List<Double> myList = Arrays.asList(3.01d, 4.02d, 5.03d);

2
分配 Double[] 不是必要的,因为 Arrays.asList 有一个 "varargs" 表单。 - Tyler
2
需要注意的是,Arrays.asList(...) 返回的列表由给定的数组支持,因此长度是固定的。为了证明这一点,请在初始化列表后尝试调用 myList.add(1.0d),你将会得到一个 UnsupportedOperationException 异常。如果你想在某个时候向列表中添加更多元素,请将 asList(...) 方法的结果传递给 ArrayList 的复制构造函数。 - William Brendel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接