Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java8流将浮点数组列表转换为基本浮点数组?_Java_Arrays_Arraylist_Java 8 - Fatal编程技术网

如何使用Java8流将浮点数组列表转换为基本浮点数组?

如何使用Java8流将浮点数组列表转换为基本浮点数组?,java,arrays,arraylist,java-8,Java,Arrays,Arraylist,Java 8,我正在尝试使用Java8流API将包含float值的ArrayList转换为一个基本浮点数组。 到目前为止,我尝试的是这样的: List<Float> floatList = new ArrayList<Float>(); float[] floatArray = floatList.stream().map(i -> i).toArray(float[]::new) List floatList=new ArrayList(); float[]floatArr

我正在尝试使用Java8流API将包含
float
值的
ArrayList
转换为一个基本浮点数组。 到目前为止,我尝试的是这样的:

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

无法将
对象[]
转换为基本数组(
float[]

另一种可能的方法(假设
非null
值)为:

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

apache的Commons为它提供了一个util,不过老实说:没有好的内置方法来处理流。对不起,这是事实

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

如果您想使用streams,您需要编写自己的自定义大小调整列表类型并收集到它,但除此之外,任何东西都不会起作用。你得写些像这样的东西

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[] result = floatList.stream().collect(
  ()-> FloatBuffer.allocate(floatList.size()), 
  FloatBuffer::put,
  (left, right) -> { 
     throw new UnsupportedOperationException("only be called in parallel stream");
  }
).array();
如果与
收集
方法一起使用,则可以完成此操作

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();
如果使用内置基元集合,只需将
浮点列表
转换为浮点数组,如下所示:

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

注意:我是Eclipse集合的提交者。

那么问题是什么呢?如果一个
double[]
就足够了,你可以使用
floatList.stream().mapToDouble(f->f.doubleValue()).toArray()
float
是一种古老的类型。因为他们没有添加
FloatStream
,只有a,你只能通过编写自己的来实现。不是dup,而是相关的:你不能将
对象[]
强制转换为
float[]
它会抛出
ClassCastException
我的意思是,这在流中是可能的,只是
int[]
长[]
双[]
。您必须编写
floatList.toArray(newfloat[0])
,您不能执行该转换。
float[] array =
    LazyIterate.adapt(floats).collectFloat(Float::floatValue).toArray();
float[] array = FloatLists.mutable.with(1.0f, 2.0f, 3.0f).toArray();