将Java字符串流转换为float数组

我正在尝试找到一种优雅的方法来将Java转换Stream<String>为float数组。到目前为止,我已经提出了:

Float[] data = input.map(Float::valueOf).toArray(Float[]::new);

但是我实际上需要一个float[]and,当我尝试:

float[] data = input.map(x -> Float.parseFloat(x)).toArray(size -> new float[]);

我收到一个错误,无法转换Object[]float[],我不太了解。

我究竟做错了什么?


泛舟湖上清波郎朗
浏览 693回答 2
2回答

慕容708150

您的代码中有一个小错误,我们将首先修复该错误,以揭示手头的较大问题:float[] data = input.map(x -> Float.parseFloat(x)).toArray(size -> new float[]);应该:float[] data = input.map(x -> Float.parseFloat(x)).toArray(size -> new float[size]);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^this is new即使看起来不是这样,您的问题也将泛型化。让我们看一下的定义Stream#toArray(...):public <A> A[] toArray(IntFunction<A[]> generator)由于此方法在中是泛型的A,因此类型A不能为原始类型。另一方面,您尝试设置A为float(这是通过类型推断完成的,这就是为什么在代码中看不到通用参数的原因)。编译器现在抱怨:error: incompatible types: inference variable A has incompatible bounds&nbsp; &nbsp; float[] data = input.stream().map(x -> Float.parseFloat(x)).toArray(size -> new float[size]);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^&nbsp; &nbsp; equality constraints: float&nbsp; &nbsp; upper bounds: Object&nbsp; where A is a type-variable:&nbsp; &nbsp; A extends Object declared in method <A>toArray(IntFunction<A[]>)1 error该问题及其答案为将a- Stringstream转换为a的问题提供了解决方案/解决方法float[]。

婷婷同学_

有没有办法获得的float[]直接从Java中任何尚未流。数字流接口只有3种可用的转换机制:mapToInt(ToIntFunction<? super T> mapper)&nbsp;->&nbsp;IntStreammapToLong(ToLongFunction<? super T> mapper)&nbsp;->&nbsp;LongStreammapToDouble(ToDoubleFunction<? super T> mapper)&nbsp;->&nbsp;DoubleStream因此,唯一的方法是使用double,这很容易:double[]&nbsp;data&nbsp;=&nbsp;input.mapToDouble(Double::parseDouble).toArray();如果您坚持float[]要从中获取资源double[],那么这可能是另一个可以帮助Guava库的问题:float[]&nbsp;floatArray&nbsp;=&nbsp;Floats.toArray(Doubles.asList(data)); //&nbsp;You&nbsp;can&nbsp;collect&nbsp;Stream&nbsp;to&nbsp;a&nbsp;Collection&nbsp;and&nbsp;pass&nbsp;directly&nbsp;Floats.toArray(list);还是简单的for-loop:float[] floatArray = new float[data.length];for (int i = 0 ; i < data.length; i++) {&nbsp; &nbsp; floatArray[i] = (float) data[i];}或者,您可以使用toArray(IntFunction<A[]> generator)返回Object类型数组的方法。但是,要取消装箱Float,您必须以相同的方式再次使用for循环-Float[]尽管可以装箱,但除了可以直接使用外,它没有任何区别。map(Function<? super T,? extends R> mapper) -> Stream<R>这里是用途:Float[] data = input.map(Float::valueOf).toArray(Float[]::new);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java