如何从float[]中获取一个流(Stream)

49
我在学习如何使用Java 8流时,注意到一些奇怪的事情。Arrays.stream()有关于int、long和double数组的方法,但没有关于float数组的方法:
  • Arrays.stream(int[]) : IntStream
  • Arrays.stream(long[]) : LongStream
  • Arrays.stream(double[]) : DoubleStream
同样,有适用于int、double等类型的Stream实现,但没有适用于float的:
  • IntStream
  • LongStream
  • DoubleStream
这是有原因的吗?推荐使用哪种方式处理float流?

我曾经认为它们只支持最常见的原始类型,但我不确定。也许你可以查看源代码并提供一个FloatStream和stream(float[]):FloatStream方法? - Puce
9
如果你想存储short、char、byte和boolean类型的数据,可以使用IntStream;如果是float类型的数据,则使用DoubleStream。库的设计者们认为没有必要再添加另外五种类型的流。 - marcinj
@marcin_j,你的评论很有价值,把它发表出来,我会接受它。 - Arnaud Denoyelle
еҸҜиғҪжҳҜеӣ дёәжІЎжңүзңҹжӯЈеҘҪзҡ„зҗҶз”ұжқҘдҪҝз”ЁfloatпјҢж— и®әз”ЁдәҺд»Җд№ҲгҖӮ - ajb
3个回答

57

这是一种更好的方法,不涉及复制数据。

DoubleStream ds = IntStream.range(0, floatArray.length)
                           .mapToDouble(i -> floatArray[i]);

1
正是我所需要的。 - stridecolossus
6
使用 IntStream 真的很令人困惑 :) - clankill3r
2
将short数组转换为IntStream:IntStream is = IntStream.range(0, shortValues.length).map(i -> shortValues[i]); - Philipp König
1
到目前为止,我见过的最优雅的解决方案... 我会添加:return ds.toArray(); - RicardoE
1
但是toArray()方法不会返回一个float数组而是一个double数组,这种情况可以帮助遍历float数组,但如果你需要一个float数组作为流输出,那么就没有太大的帮助了。 - marionmaiden

39

来自 Cay S. Horstmann 的 Java SE 8 for the Really Impatient

2.12. 原始类型流

... 如果您想存储 short、char、byte 和 boolean 类型的数据,请使用 IntStream,如果是 float 类型,请使用 DoubleStream。库设计者认为没有必要再添加另外五种流类型。


2
说实话,我宁愿使用Stream<Character>而不是使用intStream并且每次想要完成操作时都必须将int强制转换为char。 - Hakanai

3
我问了自己这个问题。为了回答它,我开始开发一个包括FloatToIntFunction和ByteToCharFunction以及(当然)FloatStream、CharStream、ByteStream等内容的库。这很快就让我头疼不已。
要做到这一点,库开发人员需要大量工作,因为你必须创建方法和接口来处理所有基本数据类型之间的转换。随着你实现更多的数据类型,它变得越来越混乱。试想一下,如果你需要实现从float到所有其他基本类型、从double到所有其他基本类型、从char到所有其他基本类型等的方法,那将会是多么繁琐。
长期解决方案是Java添加值类型,这样你就可以像使用包装类型(Stream和Stream)一样使用Stream和Stream。
请关注Valhalla项目的更新,该特性可能会在未来加入Java。 http://openjdk.java.net/projects/valhalla/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接