【发布时间】:2018-03-27 19:09:20
【问题描述】:
你如何创建Boolean.FALSE 的流,比如长度为 100?
我一直在努力的是:
- 最初我打算创建一个
Boolean.FALSE的数组。但是new Boolean[100]返回一个NULL的数组。因此,我合理地考虑将流 API 用作方便的Iterable和几乎 (1)Iterable操作工具; - 没有
Booleanno-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