亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Java 8 - 一旦 Stream 被消耗和操作給出錯誤,但在另一種情況下它不是

Java 8 - 一旦 Stream 被消耗和操作給出錯誤,但在另一種情況下它不是

喵喔喔 2021-11-03 15:10:34
我是 Java 8 的新手,希望了解這兩種情況之間的區別。我知道一旦一個流被操作和消耗,那么流就不能再次被重用,它會給出一個錯誤。場景 1:List<String> title = Arrays.asList("Java8", "In", "Action");        Stream<String> s = title.stream();        s.forEach(System.out::println);        s.forEach(System.out::println); // THIS WILL GIVE ERROR - streams has been already operated and closed.當我運行這個時,我得到以下錯誤......這是公平的。Java8InActionException in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed    at java.util.stream.AbstractPipeline.sourceStageSpliterator(Unknown Source)    at java.util.stream.ReferencePipeline$Head.forEach(Unknown Source)    at com.test.Java8InAction.CH4.TraversableOnlyOnce.main(TraversableOnlyOnce.java:12)場景 2:// Filtering unique elementsList<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);numbers.stream().forEach(System.out::println);numbers.stream().filter(n -> n % 2 == 0).distinct().forEach(System.out::println);numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println);這里我也操作了stream,關閉了終端操作,那為什么沒有報錯呢?
查看完整描述

3 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

s.forEach使用相同流的兩次調用因此出現第一個示例中的異常,而對stream()方法的調用-->numbers.stream() 每次都生成(產生)一個新流,因此不會拋出“java.lang.IllegalStateException: stream has already been operating on”或關閉”。


查看完整回答
反對 回復 2021-11-03
?
炎炎設計

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

.stream()Stream盡管在同一個集合上調用了 a 的新實例,但它創建了一個新實例


查看完整回答
反對 回復 2021-11-03
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

因為一個流只能被消費一次。如果您想多次使用供應商,請為此使用供應商

Supplier<Stream<String>> streamSupplier = ()-> Stream.of("Java8", "In", "Action");

然后用于get創建新流。

streamSupplier.get().forEach(System.out::println);

但在第二種情況下,您每次都會創建一個新流。


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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