1. 程式人生 > >jdk8之Stream

jdk8之Stream

Stream API簡化了集合框架的處理,裡面提供了多種對集合操作的方法,結合lambda表示式,能方便快捷的對集合進行操縱。
如:

    public static void main(String[] args) {
        System.out.println(Arrays.asList(1,2,3,4).stream().filter(a->a!=2).mapToDouble(a->a).sum());
    }

首先將集合stream()化處理,然後,filter只允許元素不等於2的存在,mapToDouble把int轉化成double型別,轉換的規則可以自己定義,sum()則是統計所有存在的double型別的值。
這樣處理後,大大減少了處理程式碼,以前需要幾行才能搞定的東西,現在一行即可完成,精簡了許多。Stram API提供了相當多的類似的處理api,使得集合操作更加簡化易讀。

Stream操作分為中間操作和最終操作兩種,像filter這種操作,並不是真正過濾,而是產生了一個新的Stream物件,該物件包含了原物件的符合條件的元素,這種不對原物件而是產生新物件的方式,記得是叫做惰性求值的方式,所有的後續操作都是在操作的Stream物件上產生的,屬於中間操作。而sum等最終操作,遍歷了Stream,並不產生新的Stream,屬於最終操作。不管是最終操作還是中間操作,對相同的Stream物件只能操作一次,一旦操作第二次,將會報異常,提示stream has already been
operated upon or closed。只不過中間操作產生新的Stream,能夠繼續對新Stream繼續操作,而最終操作不行了。
如:

    public static void main(String[] args) {
        Stream<Integer> s1 = Arrays.asList(1,2,3,4).stream().filter(a->a!=2);
        DoubleStream s2 = s1.mapToDouble(a->a);
        s1.mapToDouble(a->a);//這裡報錯,s1操作了兩次
    }

這樣也會報錯:

    public static void main(String[] args) {
        Stream<Integer> s1 = Arrays.asList(1
,2,3,4).stream().filter(a->a!=2); DoubleStream s2 = s1.mapToDouble(a->a); s2.sum(); s2.sum();//這裡報錯,s2操作了兩次 }

Stream另一個優點是支援並行處理,這有像hadoop,不同的是hadoop能在多臺機器上並行。
如:

    public static void main(String[] args) {
        System.out.println(Arrays.asList(1,2,3,4).stream().parallel().map(a->a+3).reduce(1, Integer::sum));
    }

parallel()意味著並行操作,map是並行對映處理的操作,reduce為歸總的處理操作。
同時Stream還有分組等其它方法,也很適合用Stream進行IO操作。java8為很多io操作都提供了Stream操作如onClose,Stream關閉的同時,與關閉相關的處理方法就會被執行。