2017-10-16 65 views
4

如何创建Boolean.FALSE的流,比如长度为100?生成布尔的流

什么我挣扎是:

  1. 本来我打算创造Boolean.FALSE数组。但是new Boolean[100]返回一个NULL的数组。所以我相当合理地考虑使用流API作为方便的Iterable和几乎(1Iterable操纵工具;
  2. 没有Boolean无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

+4

为什么你认为你不能使用'Stream.generate()'?试试这个:'Stream.generate(() - > Boolean.FALSE).limit(100)' – Jesper

+2

我无法想象这种流的任何合理用例。如果您遵循仅使用无状态函数的建议用法,即不依赖于处理顺序,则结果始终只能是由数百个相同元素组成的流或空流。无论最终结果如何,始终可以通过单个元素流生成它。 – Holger

+0

@Holger我在无向图上检测周期。需要执行的步骤之一是检测并行边缘。我标记我访问过的每个顶点以检测并行性。所以每个顶点在“被访问”数组中都有一个匹配。迭代完成后,应该重置“被访问”数组。在这里,我让这样一个流发挥。为了这个目的,我可以使用0和1的数组,但为了清晰起见,我决定使用我使用的数据。 –

回答

8

即使Boolean没有无参数的构造函数,你仍然可以使用Stream.generate使用Lambda:

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

这还具有以下优势(相比于使用构造函数),这些将是相同Boolean实例,而不是100个不同的但是相等的实例。

+0

OMG!当然!我完全忘记了关于方法参考的思考...... Thx –

7

您可以使用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()解决方案需要更多的存储,无论所需的大小的。