如何使用java 8流将浮点数ArrayList转换为原始浮点数组?

时间:2017-09-11 16:17:02

标签: java arrays arraylist java-8

我尝试使用Java 8 Stream API将包含ArrayList值的float转换为原始浮点数组。 到目前为止我尝试的东西看起来像这样:

List<Float> floatList = new ArrayList<Float>(); 
float[] floatArray = floatList.stream().map(i -> i).toArray(float[]::new)

4 个答案:

答案 0 :(得分:6)

老实说:用流来做这个没有好的内置方法。对不起,但这是事实。

如果您可以使用double[],则可以使用floatList.stream().mapToDouble(f -> f.doubleValue()).toArray(),但这可能不是您所希望的。

如果你想用流来做,你需要编写自己的自定义大小调整列表类型并收集它,但是没有什么是可行的。你必须写一些像

这样的东西
float[] toFloatArray(Collection<Float> collection) {
  class FloatArray {
    int size;
    float[] array;
    FloatArray() {
      this.size = 0;
      this.array = new float[10];
    }
    void add(float f) {
      if (size == array.length) {
        array = Arrays.copyOf(array, array.length * 2);
      }
      array[size++] = f;
    }
    FloatArray combine(FloatArray other) {
      float[] resultArray = new float[array.length + other.array.length];
      System.arraycopy(this.array, 0, resultArray, 0, size);
      System.arraycopy(other.array, 0, resultArray, size, other.size);
      this.array = resultArray;
      this.size += other.size;
      return this;
    }
    float[] result() {
      return Arrays.copyOf(array, size);
    }
  }
  return collection.stream().collect(
     Collector.of(
         FloatArray::new, FloatArray::add, 
         FloatArray::combine, FloatArray::result));
}

将您的收藏集直接转换为没有流的float[]要简单得多,或者通过简单的循环自行转换为<{p>

float[] result = new float[collection.size()];
int i = 0;
for (Float f : collection) {
  result[i++] = f;
}

或与第三方库,例如番石榴Floats.toArray

答案 1 :(得分:2)

这个怎么样?您可以使用FloatBuffer来收集float[],例如:

float[] result = floatList.stream().collect(
  ()-> FloatBuffer.allocate(floatList.size()), 
  FloatBuffer::put,
  (left, right) -> { 
     throw new UnsupportedOperationException("only be called in parallel stream");
  }
).array();

答案 2 :(得分:2)

如果您对Stream collect方法使用Eclipse Collections Collectors2,则可以完成此操作。

ArrayList<Float> floats = new ArrayList<>();
floats.add(new Float(1.0f));
floats.add(new Float(2.0f));
floats.add(new Float(3.0f));
float[] floatArray =
        floats.stream()
                .collect(Collectors2.collectFloat(
                                Float::floatValue,
                                FloatLists.mutable::empty))
                .toArray();

您也可以使用LazyIterate类而不使用Streams来完成此操作。

float[] array =
    LazyIterate.adapt(floats).collectFloat(Float::floatValue).toArray();

如果您使用内置的原始集合,您可以简单地将FloatList转换为float数组,如下所示:

float[] array = FloatLists.mutable.with(1.0f, 2.0f, 3.0f).toArray();

注意:我是Eclipse Collections的提交者。

答案 3 :(得分:1)

在您的情况下,无法将Object[]转换为原始数组(float [])。

可能的替代方式(假设Nonnull值)可以是:

Object[] arr = floatList.toArray();
for (Object o : arr) {
    System.out.println((float)o);
}

来自apache的Commons为ArrayUtils.toPrimitive()

提供了一个util