将双精度数组转换为Double类型的ArrayList

23

当我尝试将一个双精度数组转换为Double类型的ArrayList时,我遇到了以下错误:

Exception in thread "main" java.lang.ClassCastException: [D cannot be cast to java.lang.Double

下面是我的代码。

double [] firstValueArray ;

ArrayList<Double> firstValueList = new ArrayList(Arrays.asList(firstValueArray));

我正在将这个列表与另一个列表进行比较,并将结果赋值给另一个double变量。

请告诉我这个错误的原因。


5
对于 doubleArray 中的每个元素 d,将其添加到 arrayList 中。 - bestsss
5个回答

41

遗憾的是,Arrays.asList(..) 不支持基本数据类型。Apache commons-lang 可以解决这个问题。

Double[] doubleArray = ArrayUtils.toObject(durationValueArray);
List<Double> list = Arrays.asList(doubleArray);

34

使用Java 8的流API可以实现这个功能。

DoubleStream.of(doublesArray).boxed().collect(Collectors.toList());

自从Java 16以后,这变得更加简洁了。
DoubleStream.of(doublesArray).boxed().toList();

如果需要返回一个实现的ArrayList,则使用
DoubleStream.of(doublesArray).boxed().collect(Collectors.toCollection(ArrayList::new));

这个一行代码不需要任何额外的库。


23

Guava版本甚至更短:

List<Double> list = Doubles.asList(doubleArray);

参考:

注意:这是一个可变参数方法。所有可变参数方法都可以使用相同类型的数组进行调用(但不是对应的装箱/拆箱类型!!)。以下两个调用是等效的:

Doubles.asList(new double[]{1d,2d});
Doubles.asList(1d,2d);

此外,Guava的版本并没有完全遍历整个数组,而是将原始数组视为实时列表视图,在访问时仅在需要转换为对象时才进行转换。


什么是可变参数方法?这两个调用有何等价之处? - JAVA
@sunny 机制在这里描述:Java教程:可变数量参数。关键词是“它是手动创建数组的一种快捷方式”。 - Sean Patrick Floyd
似乎Doubles.asList(double... backingArray)返回的列表不允许进行任何更改,例如使用addaddAll添加元素到列表中。文档更新链接:https://google.github.io/guava/releases/19.0/api/docs/index.html?com/google/common/primitives/Doubles.html - Sayan Pal
1
@SayanPal 是的,这是设计上的。这实际上是这些列表与标准库中由Arrays.asList(elements)创建的列表所共有的。如果您需要添加元素,请将列表复制到ArrayList或LinkedList中:new ArrayList<>(Doubles.asList(1.0d, 2.0d)) - Sean Patrick Floyd

5
感谢bestsss的评论,应该作为答案:
ArrayList<Double> firstValueList = new ArrayList<Double>();
for(double d : firstValueArray) firstValueList.add(d);

1

...或者使用Java 1.7:

double[] firstValueArray = new double[] {1.0, 2.0, 3.0};

ArrayList<Double> list = DoubleStream.of( firstValueArray ).boxed().collect(
    Collectors.toCollection( new Supplier<ArrayList<Double>>() {
      public ArrayList<Double> get() {
        return( new ArrayList<Double>() );
      }
    } ) );

这似乎不是Java 7的有效答案。java.util.stream.DoubleStreamjava.util.function.Supplier是在1.8中引入的。 - SpaceTrucker

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