How to cast from List to double[] in Java?

前端 未结 7 506
野性不改
野性不改 2020-11-28 13:18

I have a variable like that:

List frameList =  new ArrayList();

/* Double elements has added to frameList */

H

相关标签:
7条回答
  • 2020-11-28 13:35

    High performance - every Double object wraps a single double value. If you want to store all these values into a double[] array, then you have to iterate over the collection of Double instances. A O(1) mapping is not possible, this should be the fastest you can get:

     double[] target = new double[doubles.size()];
     for (int i = 0; i < target.length; i++) {
        target[i] = doubles.get(i).doubleValue();  // java 1.4 style
        // or:
        target[i] = doubles.get(i);                // java 1.5+ style (outboxing)
     }
    

    Thanks for the additional question in the comments ;) Here's the sourcecode of the fitting ArrayUtils#toPrimitive method:

    public static double[] toPrimitive(Double[] array) {
      if (array == null) {
        return null;
      } else if (array.length == 0) {
        return EMPTY_DOUBLE_ARRAY;
      }
      final double[] result = new double[array.length];
      for (int i = 0; i < array.length; i++) {
        result[i] = array[i].doubleValue();
      }
      return result;
    }
    

    (And trust me, I didn't use it for my first answer - even though it looks ... pretty similiar :-D )

    By the way, the complexity of Marcelos answer is O(2n), because it iterates twice (behind the scenes): first to make a Double[] from the list, then to unwrap the double values.

    0 讨论(0)
  • 2020-11-28 13:44

    As per your question,

    List<Double> frameList =  new ArrayList<Double>();
    
    1. First you have to convert List<Double> to Double[] by using

      Double[] array = frameList.toArray(new Double[frameList.size()]);
      
    2. Next you can convert Double[] to double[] using

      double[] doubleArray = ArrayUtils.toPrimitive(array);
      

    You can directly use it in one line:

    double[] array = ArrayUtils.toPrimitive(frameList.toArray(new Double[frameList.size()]));
    
    0 讨论(0)
  • 2020-11-28 13:47

    You can use the ArrayUtils class from commons-lang to obtain a double[] from a Double[].

    Double[] ds = frameList.toArray(new Double[frameList.size()]);
    ...
    double[] d = ArrayUtils.toPrimitive(ds);
    
    0 讨论(0)
  • 2020-11-28 13:49

    Guava has a method to do this for you: double[] Doubles.toArray(Collection<Double>)

    This isn't necessarily going to be any faster than just looping through the Collection and adding each Double object to the array, but it's a lot less for you to write.

    0 讨论(0)
  • 2020-11-28 13:52

    You can use primitive collections from Eclipse Collections and avoid boxing altogether.

    DoubleList frameList = DoubleLists.mutable.empty();
    double[] arr = frameList.toArray();
    

    If you can't or don't want to initialize a DoubleList:

    List<Double> frames = new ArrayList<>();
    double[] arr = ListAdapter.adapt(frames).asLazy().collectDouble(each -> each).toArray();
    

    Note: I am a contributor to Eclipse Collections.

    0 讨论(0)
  • 2020-11-28 13:53

    With java-8, you can do it this way.

    double[] arr = frameList.stream().mapToDouble(Double::doubleValue).toArray(); //via method reference
    double[] arr = frameList.stream().mapToDouble(d -> d).toArray(); //identity function, Java unboxes automatically to get the double value
    

    What it does is :

    • get the Stream<Double> from the list
    • map each double instance to its primitive value, resulting in a DoubleStream
    • call toArray() to get the array.
    0 讨论(0)
提交回复
热议问题