为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

泛舟湖上清波郎朗 2021-04-08 18:15:41
我正在尝试找到一种优雅的方法来将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[],我不太了解。我究竟做错了什么?
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

您的代码中有一个小错误,我们将首先修复该错误,以揭示手头的较大问题:


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]);

                                                                             ^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

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

                                                                       ^

    equality constraints: float

    upper bounds: Object

  where A is a type-variable:

    A extends Object declared in method <A>toArray(IntFunction<A[]>)

1 error

该问题及其答案为将a- Stringstream转换为a的问题提供了解决方案/解决方法float[]。


查看完整回答
反对 回复 2021-04-21
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

没有办法获得的float[]直接从Java中任何尚未流。数字流接口只有3种可用的转换机制:

因此,唯一的方法是使用double,这很容易:

double[] data = input.mapToDouble(Double::parseDouble).toArray();

如果您坚持float[]要从中获取资源double[],那么这可能是另一个可以帮助Guava库的问题:

float[] floatArray = Floats.toArray(Doubles.asList(data));
// You can collect Stream to a Collection and pass directly Floats.toArray(list);

还是简单的for-loop

float[] floatArray = new float[data.length];

for (int i = 0 ; i < data.length; i++) {

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


查看完整回答
反对 回复 2021-04-21
  • 2 回答
  • 0 关注
  • 692 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信