【问题标题】:How to get a Stream from a float[]如何从 float[] 中获取 Stream
【发布时间】:2014-04-16 10:00:50
【问题描述】:

当我发现一些奇怪的东西时,我正在学习如何使用 java 8 流。

Arrays.stream() 拥有除浮点数组之外的所有方法:

  • Arrays.stream(int[]) : IntStream
  • Arrays.stream(long[]) : LongStream
  • Arrays.stream(double[]) : DoubleStream

同样,有 int、double 等的 Stream 实现,但没有浮点数:

  • IntStream
  • LongStream
  • DoubleStream

这是有原因的吗?

使用浮动流的推荐方法是什么?

【问题讨论】:

  • 我的印象是它们只支持开箱即用的最常见的原始类型,但我不确定。也许你可以看看源代码,想出一个 FloatStream 和一个 stream(float[]): FloatStream 方法?
  • 来自“真正不耐烦的 Java SE 8”:“如果要存储 short、char、byte 和 boolean,请使用 IntStream,而对于 float,请使用 DoubleStream。库设计者没有'认为不值得再添加五种流类型。"
  • @marcin_j 您的评论值得回答。发布它,我会接受它。
  • 可能是因为没有真正好的理由使用 float 来做任何事情。

标签: java java-8 java-stream


【解决方案1】:

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

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

【讨论】:

  • 正是我想要的
  • 它使用 IntStream 太令人困惑了:)
  • 从短数组转换为 IntStream IntStream is = IntStream.range(0, shortValues.length).map(i -> shortValues[i]);
  • 迄今为止我见过的最优雅的解决方案......我会添加:``return ds.toArray();``
  • 但是 toArray() 方法不会返回双精度数组而不是浮点数吗?这种情况有助于遍历浮点数组,但如果您需要浮点数组作为流输出,则无济于事。
【解决方案2】:

来自Java SE 8 for the Really Impatient,作者 Cay S. Horstmann:

2.12。原始类型流

... 如果要存储 short、char、byte 和 boolean,请使用 IntStream,对于浮点数,使用 DoubleStream。图书馆设计师 认为不值得再添加五种流类型。

【讨论】:

  • tbh,我宁愿使用 Stream 而不是使用 intStream 并且每次我想用它做任何事情时都必须将 int 转换为 char。
【解决方案3】:

我问自己这个问题。为了回答这个问题,我开始研究一个包含 FloatToIntFunction 和 ByteToCharFunction 以及(当然)FloatStream、CharStream、ByteStream 等内容的库。这很快让我头疼。

库开发人员需要做很多工作才能做到这一点,因为您必须在所有原始数据类型之间创建方法和接口。当你实现更多的数据类型时,它会变得越来越大。想象一下,必须实现从 float 到所有其他原始类型、double 到所有其他原始类型、char 到所有其他原始类型等的方法。

对此的长期解决方案是让 Java 添加值类型,以便您可以执行 Stream<int>Stream<float> 之类的操作,而不是使用包装类型(Stream<Integer>Stream<Float>

查看 Project Vahalla 以了解有关此功能的更新,这些更新可能会在未来添加到 Java 中。 http://openjdk.java.net/projects/valhalla/

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 2023-03-04
    • 2017-12-22
    • 2015-02-13
    • 2020-08-09
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多