3 回答

TA貢獻1825條經驗 獲得超6個贊
不要分配Stream.of(array)給中間變量,只需直接在Supplier:
Supplier<Stream<String>> streamSupplier = () -> Stream.of(array);
那是因為以前您只會在調用時始終提供相同的引用,supplier.get()但實際上您想返回一個新的Stream.
同樣正如@Eugene 所建議的,使用Arrays.stream()overStream.of()是首選。因為后者是一個可變參數方法,但只是委托給前者。
也可以使用以下Stream.peek()方法簡化您當前的方法:
long count = Arrays.stream(array)
.peek(System.out::println)
.count();

TA貢獻1836條經驗 獲得超5個贊
Stream::count
是關閉流的終端操作,因此沒有更多的管道可以繼續(xù)。
你創(chuàng)建Stream<String>
你把它放到之前Supplier
。如果您希望供應商在每次調用時提供一個新的 Stream,請Stream<String>
直接在Supplier
.
Supplier<Stream<String>> streamSupplier = () -> Stream.of(array);
然后streamSupplier.get()
將始終使用新的Stream<Stream>
.
但是,您可能會獲得相同的結果,Stream::peek
其工作方式相同Stream::forEach
,但不關閉Stream
但返回相同的未修改結果(@Lino 更快)。
long count = streamSupplier.get().peek(System.out::println).count();

TA貢獻1788條經驗 獲得超4個贊
你得到的例外是合適的,它告訴你需要研究什么。從Java 8 Stream 類:
一個流應該只被操作一次(調用一個中間或終端流操作)。例如,這排除了“分叉”流,其中相同的源提供兩個或多個管道,或者同一流的多次遍歷。如果流實現檢測到流正在被重用,它可能會拋出 IllegalStateException。但是,由于某些流操作可能會返回其接收器而不是新的流對象,因此可能無法在所有情況下檢測到重用。
添加回答
舉報