Collectors.toList()的理解


Collectors.toList()用來結束Stream流。

    public static void main(String[] args) {

        List<String> list = Arrays.asList("hello","world","stream");
        list.stream().map(item->item+item).collect(Collectors.toList()).forEach(System.out::println);
        list.stream().map(item->item+item).collect(
                ArrayList::new,
                (list1,value )-> list1.add(value),
                (list1 ,list2)-> list1.addAll(list2)
                ).forEach(System.out::println);

    }
    <R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);

從文檔上我們可以知道,collect()方法接收三個函數式接口

 

  • supplier表示要返回的類型,Supplier<R> supplier不接收參數,返回一個類型,什么類型,這里是ArrayList類型,所以是ArrayList::new
  • BiConsumer<R, ? super T> accumulator接收兩個參數,一個是返回結果(ArrayList),一個是stream中的元素,會遍歷每一個元素,這里要做的是把遍歷的每一個元素添加到要返回的ArrayList中,所以第二個參數(list1,value )-> list1.add(value),
  • BiConsumer<R, R> combiner接收兩個參數,一個是返回結果,一個是遍歷結束后得到的結果,這里要把遍歷結束后得到的list添加到要返回的list中去,所以第三個參數是,(list1 ,list2)-> list1.addAll(list2)
 
    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);
    }

我們可以看到,Collectors.toList()默認也是這么實現的,所以他們兩種寫法是等價的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM