【问题标题】:Generate stream of Boolean生成布尔流
【发布时间】:2018-03-27 19:09:20
【问题描述】:

你如何创建Boolean.FALSE 的流,比如长度为 100?

我一直在努力的是:

  1. 最初我打算创建一个Boolean.FALSE 的数组。但是new Boolean[100] 返回一个NULL 的数组。因此,我合理地考虑将流 API 用作方便的 Iterable 和几乎 (1) Iterable 操作工具;
  2. 没有Boolean no-params 构造函数(2),所以我不能 使用Stream.generate(),因为它接受Supplier<T> (3)。

我发现Stream.iterate(Boolean.FALSE, bool -> Boolean.FALSE).limit(100); 给出了我想要的,但它似乎不是一个非常优雅的解决方案,恕我直言。

还有一个选项,我发现(4)是IntStream.range(0, 100).mapToObj(idx -> Boolean.FALSE);,这在我看来更奇怪。

尽管这些选项不违反流 API 的管道概念,但有没有更简洁的方法来创建 Boolean.FALSE 的流?

【问题讨论】:

  • 为什么你认为你不能使用Stream.generate()?试试这个:Stream.generate(() -> Boolean.FALSE).limit(100)
  • 我无法想象这样一个流的任何合理用例。如果您遵循仅使用无状态函数的推荐用法,即不依赖于处理顺序,则结果始终只能是数百个相同元素的流或空流。无论最终结果是什么,总是可以从单个元素流中生成它。
  • 感谢您尝试解释,但我仍然无法想象,您想如何以有用的方式使用 100 个false 常量。您在解释中谈论的是数组,但流不是数组。它不像数组那样工作。在这方面,如果您使用 100 个零的流作为起点并不重要,它们与 100 个false 常量一样毫无意义。如果您需要使用 false 初始化的布尔数组,您可以像 new boolean[100] 一样简单地创建它,而无需流。
  • 这不好回答,你需要一些经验来决定。并不是每个人都会有相同的看法。根据经验,如果每个元素的处理彼此独立(或其位置)并且生成的代码比循环的代码更简单,或者允许(以简单的方式)做比以前更复杂的事情。或者,如果有合理的期望从并行处理中受益(这使得处理顺序的独立性更加重要)。
  • 如果这只是将一个数组初始化为一个值,你可以使用java.util.Arrays.fill,不需要流。 Arrays.fill(array, Boolean.FALSE);

标签: java java-8 java-stream


【解决方案1】:

即使 Boolean 没有无参数构造函数,您仍然可以使用 lambda 来使用 Stream.generate

Stream.generate(() -> Boolean.FALSE).limit(100)

这还有一个优点(与使用构造函数相比),它们将是 相同 Boolean 实例,而不是 100 个不同但相同的实例。

【讨论】:

  • 天啊!当然!我完全忘记了考虑方法引用的 lambdas ...... Thx
【解决方案2】:

你可以使用Collectionsstatic <T> List<T> nCopies(int n, T o)

Collections.nCopies (100, Boolean.FALSE).stream()...

请注意,nCopies 返回的Listtiny (it contains a single reference to the data object).,因此与Stream.generate().limit() 解决方案相比,它不需要更多存储空间,无论所需大小如何。

【讨论】:

    【解决方案3】:

    当然你可以直接创建流

    Stream.Builder<Boolean> builder = Stream.builder();
    for( int i = 0; i < 100; i++ )
      builder.add( false );
    Stream<Boolean> stream = builder.build();
    

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2016-08-13
      • 2014-10-06
      • 2023-03-28
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      相关资源
      最近更新 更多