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

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

如何在 java 8 流 api 中延遲初始化 Collectors.toList()?

如何在 java 8 流 api 中延遲初始化 Collectors.toList()?

慕的地6264312 2021-06-17 18:08:13
我想根據(jù)過濾器收集項目。但如果未找到匹配項,則不應初始化結果列表。我更喜歡 null 而不是空列表。List<String> match = list            .stream()            .filter(item -> item.getProperty == "match")            .collect(Collectors.toList());if (match != null && !match.isEmpty()) {    //handle seldom match}問題:大多數(shù)時候我不會有匹配項,導致集合為空。這意味著即使我不需要它,大部分時間列表也會被實例化。
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

Collecto.toList()分配ListusingArrayList::new這是一個非常便宜的操作,因為ArrayList在插入元素之前實際上不會分配支持數(shù)組。構造函數(shù)所做的就是將內部Object[]字段初始化為靜態(tài)創(chuàng)建的空數(shù)組的值。只有在插入第一個元素時,實際的后備數(shù)組才被初始化為其“初始大小”。

那么為什么要經歷避免這種結構的痛苦呢?這聽起來像是過早的優(yōu)化。

如果您非常擔心 GC 壓力,請不要使用 Streams。流和收集器本身的創(chuàng)建可能比列表要“昂貴”得多。


查看完整回答
反對 回復 2021-06-30
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

我只考慮一種情況,除了Collectors.toList()計算成本高昂之外,否則使用:


... collect(Collectors.collectingAndThen(list -> {

          list.isEmpty() ? null: list;

   }))

但請記住,List如果缺少元素,使用它的人很可能會期望一個空的,而不是空的。


創(chuàng)造一個空ArrayList的非常便宜,在這里懶惰只會讓事情變得更糟。


否則,如果您真的想要,這里有一個變體可以推遲到 null :


 private static <T> List<T> list(Stream<T> stream) {

    Spliterator<T> sp = stream.spliterator();

    if (sp.getExactSizeIfKnown() == 0) {

        System.out.println("Exact zero known");

        return null;

    }


    T[] first = (T[]) new Object[1];

    boolean b = sp.tryAdvance(x -> first[0] = x);

    if (b) {

        List<T> list = new ArrayList<>();

        list.add(first[0]);

        sp.forEachRemaining(list::add);

        return list;

    }


    return null;

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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