Как привести из списка <Double>к двойному значению [] в Java? - PullRequest
58 голосов
/ 16 мая 2011

У меня есть такая переменная:

List<Double> frameList =  new ArrayList<Double>();

/* Double elements has added to frameList */

Как я могу иметь новую переменную типа double[] из этой переменной в Java с высокой производительностью?

Ответы [ 7 ]

83 голосов
/ 17 декабря 2014

С вы можете сделать это следующим образом.

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

Что он делает:

  • получить Stream<Double> из списка
  • сопоставляет каждый двойной экземпляр с его примитивным значением, в результате чего DoubleStream
  • вызовите toArray(), чтобы получить массив.
41 голосов
/ 16 мая 2011

Высокая производительность - каждый объект Double переносит одно значение double.Если вы хотите сохранить все эти значения в массиве double[], то у вас есть для перебора коллекции Double экземпляров.Отображение O(1) невозможно, это должно быть самое быстрое, что вы можете получить:

 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)
 }

Спасибо за дополнительный вопрос в комментариях;) Вот исходный код метода подгонки ArrayUtils#toPrimitive:

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;
}

(И поверьте мне, я не использовал его для своего первого ответа - хотя он выглядит ... довольно похоже :-D)

Кстати,Сложность ответа Марселоса - O (2n), потому что он повторяется дважды (за кадром): сначала сделать Double[] из списка, затем развернуть значения double.

26 голосов
/ 27 мая 2011

Гуава имеет метод, который может сделать это для вас: double [] Doubles.toArray (Collection )

Это не обязательно будетбыть быстрее, чем просто проходить по Collection и добавлять каждый Double объект в массив, но для вас писать намного меньше.

6 голосов
/ 16 мая 2011

Вы можете использовать класс ArrayUtils от commons-lang для получения double[] от Double[].

Double[] ds = frameList.toArray(new Double[frameList.size()]);
...
double[] d = ArrayUtils.toPrimitive(ds);
5 голосов
/ 15 февраля 2017

По вашему вопросу

List<Double> frameList =  new ArrayList<Double>();
  1. Сначала вам нужно конвертировать List<Double> в Double[] с помощью

    Double[] array = frameList.toArray(new Double[frameList.size()]);
    
  2. Далее вы можете конвертировать Double[] в double[], используя

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

Вы можете напрямую использовать его в одной строке:

double[] array = ArrayUtils.toPrimitive(frameList.toArray(new Double[frameList.size()]));
5 голосов
/ 16 мая 2011

Вы можете преобразовать в Double[], вызвав frameList.toArray(new Double[frameList.size()]), но вам нужно будет повторить список / массив, чтобы преобразовать в double[]

2 голосов
/ 27 марта 2016

Вы можете использовать примитивные коллекции из Eclipse Collections и вообще избегать бокса.

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

Если вы не можете или не хотите инициализировать DoubleList:

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

Примечание: я участник коллекций Eclipse.

...