八 JDK8新特性——第三節(jié) 兩種獲取Stream流的方式

1、兩種獲取Stream流的方式

java.util.stream.Stream<T> 是java 8 加入的最常用的流接口清女,這并不是一個函數(shù)式接口
獲取流兩種方式:
1、所有Collection 集合(單列集合)都可以通過stream默認方式獲取流
default Stream<E> stream()
2、Stream接口的靜態(tài)方法of可以獲取數(shù)組對應的流
static <T> Stream<T> of (T... values)
參數(shù)是一個可變參數(shù)绘盟,就可傳遞一個數(shù)組

package con.day13.demo05.StreamAndMethod.Stream;

import java.util.*;
import java.util.stream.Stream;

/*
兩種方式獲取流
1、Collection 接口中的方法stream()
2龄毡、Stream接口的靜態(tài)方法of:返回單個元素的序列Stream
static <T> Stream<T> of (T... values)
參數(shù)是一個可變參數(shù),可傳遞一個數(shù)組
 */
public class Demo02GetStream {
    public static void main(String[] args) {
        //把單列集合轉(zhuǎn)換成Stream
        List<String> list = new ArrayList();
        Stream<String> stream = list.stream();

        //Set
        Set<String> set = new HashSet<>();
        Stream<String> stream1 = set.stream();

        Map<String,String> map1 = new HashMap<>();
        Set<String> strings = map1.keySet();
        Stream<String> stream2 = strings.stream();

        Collection<String> values = map1.values();
        Stream<String> stream3 = values.stream();

        Set<Map.Entry<String, String>> entries = map1.entrySet();
        Stream<Map.Entry<String, String>> stream4 = entries.stream();

        //把數(shù)組轉(zhuǎn)換成Stream流
        Stream<Integer> stream5 = Stream.of(1, 2, 34, 4);  //可變參數(shù)

        //可變參數(shù)可以傳數(shù)組
        int[] arr = {1,3,4,5};
        Stream<int[]> stream6 = Stream.of(arr);

        String[] arr2 = {"a","fff","fs"};
        Stream<String> stream7 = Stream.of(arr2);
    }
}

2沦零、Stream 流中的常用方法-forEach

常用方法
forEach
package con.day13.demo05.StreamAndMethod.Stream;

import java.util.stream.Stream;

/*
void forEach(Consumer<? super T> action)祭隔;
該方法接收一個Consumer函數(shù)接口,會將每一個流元素交給該函數(shù)進行處理
Consumer 是一個消費性的函數(shù)式接口,可以傳遞Lambda表達式
注意:
for each 用來遍歷流中的數(shù)據(jù)
是終結(jié)方法疾渴, 遍歷之后不能調(diào)用Stream流中的其他方法

 */
public class Demo02Streamfor {
    public static void main(String[] args) {
        Stream<String> af = Stream.of("af", "sdkf", "cc", "gg", "hh");
       /* af.forEach((String name)->{
            System.out.println(name);
        });*/

        //簡化Lambda表達式
        System.out.println("--------");
        af.forEach((name)-> System.out.println(name));
    }
}

結(jié)果
 af
sdkf
cc
gg
hh

3千贯、Stream 流中的常用方法-filter

filter
package con.day13.demo05.StreamAndMethod.Stream;

import java.util.stream.Stream;

public class Demo02StreamFilter {
    public static void main(String[] args) {
        //創(chuàng)建Stream 流
        Stream<String> stream = Stream.of("張三豐", "張無極", "張強", "趙敏", "周芷若");
        //對Stream 流中的元素進行過濾,只要姓張的, 得到一個新的流搞坝, 接收他
        Stream<String> stream2 =  stream.filter((String name )->{ return name.startsWith("張");});
        stream2.forEach((name)-> System.out.println(name));
    }
}

4搔谴、Stream 流的特點,只能使用一次

Stream流屬于管道流桩撮,只能被使用一次
第一個Stream流調(diào)用完畢方法敦第,數(shù)據(jù)就會流轉(zhuǎn)到下一個Stream 上
而這時第一個Stream流已經(jīng)使用完畢,就會關閉了
所以第一個Streaml流就不能再調(diào)用方法了

package con.day13.demo05.StreamAndMethod.Stream;

import java.util.stream.Stream;

public class Demo02StreamFilter {
    public static void main(String[] args) {
        //創(chuàng)建Stream 流
        Stream<String> stream = Stream.of("張三豐", "張無極", "張強", "趙敏", "周芷若");
        //對Stream 流中的元素進行過濾店量,只要姓張的, 得到一個新的流芜果, 接收他
        Stream<String> stream2 =  stream.filter((String name )->{ return name.startsWith("張");});
        stream2.forEach((name)-> System.out.println(name));

        stream.forEach((name)-> System.out.println(name));  //報錯,
        //Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
    }
}

結(jié)果
張三豐
張無極
張強
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
    at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at con.day13.demo05.StreamAndMethod.Stream.Demo02StreamFilter.main(Demo02StreamFilter.java:13)

5融师、Stream 流中的常用方法-map

map映射
package con.day13.demo05.StreamAndMethod.Stream;

import java.util.stream.Stream;

public class Demo02StreamMap {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("1", "2", "3", "4");
        Stream<Integer> integerStream = stream.map((s) -> Integer.parseInt(s));

        integerStream.forEach(i-> System.out.println(i));

    }
}
結(jié)果
1
2
3
4

6右钾、Stream 流中的常用方法-count

count
package con.day13.demo05.StreamAndMethod.Stream;

import java.util.ArrayList;
import java.util.stream.Stream;

//統(tǒng)計流中元素的個數(shù), 返回值是long類型的整數(shù),是一個終結(jié)方法旱爆,不能再調(diào)用Stream中其他方法
public class Demo02StreamCount {
    public static void main(String[] args) {
        Stream<String> a = Stream.of("a", "b", "d");
        System.out.println(a.count());

        ArrayList<String> list = new ArrayList<>();
        list.add("22");
        list.add("4");
        list.add("7");

        Stream<String> stream2 = list.stream();
        long count = stream2.count();
        System.out.println(count);
    }
}

3 
3

7舀射、Stream 流中的常用方法-limit

limit 是一個延遲方法, 對流中元素截取疼鸟,返回一個新的流后控,可以調(diào)用流中其他方法


limit
package con.day13.demo05.StreamAndMethod.Stream;

import java.util.stream.Stream;

public class Demo02StreamLimit {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("44", "fsdf", "t", "9", "2", "iu");
        Stream<String> limit = stream.limit(4);
       // System.out.println(limit.count());  //4
        limit.forEach(s-> System.out.println(s));
    }
}

}

結(jié)果
44
fsdf
t
9

8、Stream 流中的常用方法-skip

skip
package con.day13.demo05.StreamAndMethod.Stream;

import java.util.Arrays;
import java.util.stream.Stream;

public class Demo02StreamSkip {
    public static void main(String[] args) {
        String[] arr  = {"sdf","fsd","wr","il"};
        Stream<String> stream = Stream.of(arr);
//跳過前三個元素
        Stream<String> skip = stream.skip(3);
      //  System.out.println(skip.count());   1
//遍歷新的流
        skip.forEach(s -> System.out.println(s));  //il
    }
}

9空镜、Stream 流中的常用方法-concat

concat
package con.day13.demo05.StreamAndMethod.Stream;

import java.util.stream.Stream;

public class Demo02StreamConcat {
    public static void main(String[] args) {
        String[] arr  = {"sdf","fsd","wr","il"};
        Stream<String> stream = Stream.of(arr);

        String[] arr2  = {"tyui","rg","ghj","ghj"};
        Stream<String> stream2 = Stream.of(arr);

        Stream<String> concat1 = Stream.concat(stream, stream2);
        concat1.forEach(e-> System.out.println(e));
    }
}

結(jié)果
sdf
fsd
wr
il
sdf
fsd
wr
il

10浩淘、練習,集合元素處理吴攒,傳統(tǒng)方式

題目

import java.util.ArrayList;

public class DemoArrayList {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("張無忌");
        list1.add("黑色褲");
        list1.add("迪麗熱巴");
        list1.add("古力扎");
        list1.add("張收到回復");
        list1.add("胡返回");

        //只要名字為3個字的成員张抄,儲存到新集合中
        ArrayList<String> list11 = new ArrayList<>();
        for (String s : list1) {

            if (s.length() == 3){
                list11.add(s);
            }
        }


        //只要前三個人
        ArrayList<String> list12 = new ArrayList<>();


        for (int i = 0; i < 3; i++) {
            list12.add(list11.get(i)); //i = 0 1 2
        }



        ArrayList<String> list2 = new ArrayList<>();
        list2.add("張三豐");
        list2.add("張三好");
        list2.add("張三符");
        list2.add("王三看");
        list2.add("張三與");
        list2.add("楊三與");

        //只要姓張的
        ArrayList<String> list21 = new ArrayList<>();
        for (String s2 : list2) {
            //只要姓張的成員
            if (s2.startsWith("張")) {
                list21.add(s2);
            }
            }

        //不要前兩個
        ArrayList<String> list22 = new ArrayList<>();
        for (int i = 2; i < list21.size(); i++) {
            list22.add(list21.get(i)) ; //2 - length
        }

        //5、將兩個隊伍合并成一個隊伍洼怔,存儲到一個新的集合中
        ArrayList<String> all = new ArrayList<>();
        all.addAll(list12);
        all.addAll(list22);

        //6、根據(jù)姓名創(chuàng)建Person對象极谊,存儲到一個新集合中
        ArrayList<Person> list = new ArrayList<>();

        for (String s : all) {
            list.add(new Person(s));
        }

        //7轻猖、打印整個隊伍的Person
        for (Person person : list) {
            System.out.println(person);
        }

        }
    }

結(jié)果
Person{name='張無忌'}
Person{name='黑色褲'}
Person{name='古力扎'}
Person{name='張三符'}
Person{name='張三與'}

11咙边、練習,集合元素處理王带, Stream 流處理

package con.day13.demo05.StreamAndMethod.Lianxi;

import java.util.ArrayList;
import java.util.stream.Stream;

public class DemoStream01 {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("張無忌");
        list1.add("黑色褲");
        list1.add("迪麗熱巴");
        list1.add("古力扎");
        list1.add("張收到回復");
        list1.add("胡返回");

        Stream<String> oneStream = list1.stream().filter(name->name.length() == 3).limit(3);


        ArrayList<String> list2 = new ArrayList<>();
        list2.add("張三豐");
        list2.add("張三好");
        list2.add("張三符");
        list2.add("王三看");
        list2.add("張三與");
        list2.add("楊三與");

        Stream<String> twoStream = list2.stream().filter(name->name.startsWith("張")).skip(2);

       Stream.concat(oneStream, twoStream).map(name -> new Person(name)).forEach(p-> System.out.println(p));
//簡寫
       Stream.concat(oneStream, twoStream).map(Person::new).forEach(System.out::println);

    }
}

結(jié)果
Person{name='張無忌'}
Person{name='黑色褲'}
Person{name='古力扎'}
Person{name='張三符'}
Person{name='張三與'}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盟戏,隨后出現(xiàn)的幾起案子甥桂,更是在濱河造成了極大的恐慌黄选,老刑警劉巖婶肩,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件民镜,死亡現(xiàn)場離奇詭異险毁,居然都是意外死亡畔况,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門馋嗜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葛菇,“玉大人眯停,你說我怎么就攤上這事庵朝。” “怎么了椎瘟?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵肺蔚,是天一觀的道長宣羊。 經(jīng)常有香客問我仇冯,道長族操,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任泼舱,我火速辦了婚禮娇昙,結(jié)果婚禮上冒掌,老公的妹妹穿的比我還像新娘。我一直安慰自己宋渔,他們只是感情好皇拣,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布薄嫡。 她就那樣靜靜地躺著,像睡著了一般吩坝。 火紅的嫁衣襯著肌膚如雪钉寝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天俘枫,我揣著相機與錄音逮走,去河邊找鬼师溅。 笑死,一個胖子當著我的面吹牛蘸鲸,可吹牛的內(nèi)容都是我干的起便。 我是一名探鬼主播榆综,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼鼻疮,長吁一口氣:“原來是場噩夢啊……” “哼琳轿!你這毒婦竟也來了崭篡?” 一聲冷哼從身側(cè)響起琉闪,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斯入,沒想到半個月后刻两,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滴某,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年杀怠,在試婚紗的時候發(fā)現(xiàn)自己被綠了赔退。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片证舟。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡女责,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墙基,到底是詐尸還是另有隱情刷喜,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布初茶,位于F島的核電站恼布,受9級特大地震影響搁宾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爽待,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一堕伪、第九天 我趴在偏房一處隱蔽的房頂上張望欠雌。 院中可真熱鬧富俄,春花似錦、人聲如沸霍比。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辩尊,卻和暖如春康辑,著一層夾襖步出監(jiān)牢的瞬間疮薇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胖齐,地道東北人呀伙。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓剿另,卻偏偏與公主長得像贬蛙,于是被迫代替她去往敵國和親阳准。 傳聞我的和親對象是個殘疾皇子氛堕,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容