第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Stream StreamSupplier

使用 Stream StreamSupplier

藍山帝景 2021-05-31 10:35:17
我正在使用以下代碼重用 Stream 但得到java.lang.IllegalStateException: 流已經被操作或關閉代碼public static void main(String[] args) {    try {        String[] array = { "a", "b", "c", "d", "e" };        Stream<String> ss = Stream.of(array);        Supplier<Stream<String>> streamSupplier = () -> ss;        long count = streamSupplier.get().count();        // get new stream        streamSupplier.get().forEach(x -> System.out.println(x));        // get another new stream        System.out.println(count);    } catch (Exception e) {        e.printStackTrace();    }}
查看完整描述

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();


查看完整回答
反對 回復 2021-06-02
?
一只甜甜圈

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();


查看完整回答
反對 回復 2021-06-02
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

你得到的例外是合適的,它告訴你需要研究什么。從Java 8 Stream 類

一個流應該只被操作一次(調用一個中間或終端流操作)。例如,這排除了“分叉”流,其中相同的源提供兩個或多個管道,或者同一流的多次遍歷。如果流實現檢測到流正在被重用,它可能會拋出 IllegalStateException。但是,由于某些流操作可能會返回其接收器而不是新的流對象,因此可能無法在所有情況下檢測到重用。


查看完整回答
反對 回復 2021-06-02
  • 3 回答
  • 0 關注
  • 314 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號