1. 程式人生 > >java8-Stream原理

java8-Stream原理

前言

java8新特性目前使用非常廣泛,其中Stream更是最常用的特性,這篇文章將介紹Stream的原理,如果你現在還不怎麼會用的話可以看一下菜鳥教

https://www.runoob.com/java/java8-streams.html,或者我的部落格https://www.runoob.com/java/java8-streams.html。如果你想學更多實戰中的運用最好

去讀一下《Java 8 in Action》和 《Effective Java》第三版,《Java 8 in Action》這本書從原理講解,效能測試和分析,實戰用法多個角度介紹java8新特性,

是非常值得讀的一本好書。

原理分析

下面是一個小例子

public static void main(String[] args) {
        List<UserInfo> userInfos = getUserInfos();
        //日常開發中常見用法,先filter後map,然後收整合一個集合
        List<String> userNames = userInfos.stream().filter(userInfo -> userInfo.getAge() > 23).map(UserInfo::getName)
                .collect(Collectors.toList());
        System.out.println(userNames);
    }

    private static List<UserInfo> getUserInfos() {
        UserInfo userInfo = new UserInfo();
        userInfo.setName("大明");
        userInfo.setAge(23);

        UserInfo userInfo2 = new UserInfo();
        userInfo2.setName("小明");
        userInfo2.setAge(24);

        List<UserInfo> userInfos = Lists.newArrayList();
        userInfos.add(userInfo);
        userInfos.add(userInfo2);
        return userInfos;
    }

我們知道流的中間操作是不會真正執行的,最後呼叫終止操作時才會真正執行上面程式碼中的filter和map中傳入的方法,那麼這些方法肯定需要存起來,等到終止操作的時候才呼叫。

下面這張圖表示Stream的執行過程,這些中間操作由一個連結串列來連線起來。

 

 

 緊接著執行colletct將這些操作反向連線起來,然後對資料一層一層的進行操作

 

 

閱讀原始碼建議

Stream的原始碼可以直接直接點方法進去,然後看一下繼承結構,閱讀一下文件,然後看程式碼就能搞懂了,唯一難受的是大量使用了內部類,閱讀原始碼時最好切多個頁面來