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

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

空列表上的 Java 8 流操作

空列表上的 Java 8 流操作

Cats萌萌 2022-06-04 10:42:40
我只是想知道 Java 8流在空列表上的行為是什么。List<?> emptyList = new ArrayList<>();List<?> processedList = emptyList.stream().collect(Collectors.toList());這將是空列表還是null?我知道流做延遲傳播,所以在這種情況下會調用 go tocollect()方法還是會在stream()方法結束?
查看完整描述

2 回答

?
慕俠2389804

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

collect是終端操作,因此必須對其進行評估。

使用 終止Stream管道時collect(Collectors.toList()),您將始終獲得輸出List(您永遠不會獲得null)。如果Stream是空的(由于流的源為空,或者由于在終端操作之前過濾掉了流的所有元素,它是否為空并不重要),輸出List也將為空。


查看完整回答
反對 回復 2022-06-04
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

你會得到一個空集合。正如收集在文檔中解釋的那樣:

使用收集器對此流的元素執行可變歸約操作。

可變減少

可變歸約操作在處理流中的元素時將輸入元素累積到可變結果容器中,例如 Collection 或 StringBuilder。

由于原始輸入為空或由于過濾器操作,您將獲得一個空集合。

感謝@Andy Turner 的提示。

事實是 toList() 累積到一個新列表中,這意味著它不會返回 null。

并且文檔得到了 Collectors.toList() 的解釋:

返回將輸入元素累積到新列表中的收集器。

我們可以從源碼中得到

   public static <T>

    Collector<T, ?, List<T>> toList() {

        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,

                                   (left, right) -> { left.addAll(right); return left; },

                                   CH_ID);

    }

它永遠不會產生空輸出,但您仍然可以使用自定義收集器獲得空值,如 Andy 所示。


查看完整回答
反對 回復 2022-06-04
  • 2 回答
  • 0 關注
  • 289 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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