2017-10-16 64 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()解決方案需要更多的存儲,無論所需的大小的。