создание массива объектов с использованием Java Stream - PullRequest
0 голосов
/ 27 октября 2018

Я считаю целесообразным использовать потоки Java для создания больших массивов объектов, как в:

double[] doubleArray = {array of double};
DoubleWrapper[] wrapperArray = new DoubleWrapper[doubleArray.length;
IntStream
     .range(0, doubleArray.length)
     .forEach(index -> wrapperArray.setElement(index, myArray[index]));

Это работает. Но я читал, что полагаться на «побочные эффекты» - это плохая практика, но в качестве результата потока я должен получить желаемый результат.

Я думаю, что ближе к этому при извлечении массива из объекта:

DoubleWrapper[] wrapperArray = {array of DoubleWrapper}
double[] mArray = IntStream
                    .range(0, divisor.size())
                    .mapToDouble(index ->  wrapperArray.getElement(index))
                    .toArray();

Есть ли лучший способ сделать это с потоками? Если нет, я должен вернуться к использованию "для циклов"?

1 Ответ

0 голосов
/ 27 октября 2018

Конечно. Вместо того, чтобы циклически проходить по индексам, а затем получать элемент массива по индексу, вы должны циклически проходить по элементам массива, превращая массив в поток:

double[] mArray = Stream.of(wrapperArray)
   .mapToDouble(DoubleWrapper::getValue)
   .toArray();

или

DoubleWrapper[] wrapperArray = DoubleStream.of(doubleArray)
    .mapToObj(DoubleWrapper::new)
    .toArray(length -> new DoubleWrapper[length])

Но самая большая ошибка, вероятно, заключается в том, чтобы иметь собственный класс DoubleWrapper вместо java.lang.Double и использовать массивы объектов вместо коллекций более высокого уровня (таких как списки, наборы и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...