Java 8 Stream操作的介紹

什么是Stream宋欺?

Stream將要處理的元素集合看作一種流,在流的過程中雪营,借助Stream API對流中的元素進行操作弓千,比如:篩選、排序献起、聚合等洋访。


image.png

如何創(chuàng)建Stream

list.stream() //轉(zhuǎn)換成流進行操作

Stream 操作符的分類

主要分為兩種:中間操作符和結(jié)束操作符

中間操作符:Lambda表達式的鏈式操作,可以鏈式對流進行操作谴餐,操作完后還是返回流

結(jié)束操作符:用來結(jié)束流的姻政,數(shù)據(jù)經(jīng)過中間加工操作,最后通過結(jié)束操作符對數(shù)據(jù)進行收集或者消費的岂嗓,數(shù)據(jù)到了結(jié)束操作這里就不會向下流動了汁展,結(jié)束操作符只能使用一次


中間操作符例子

1.filter
     /**
     * 用于過濾不滿足條件的元素
     */
    @Test
    public void filter(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        List<String> filtered = list.stream().filter(str -> str.contains("峰")).collect(Collectors.toList());
        System.out.println(filtered);
    }
2.distinct
    /**
     * 用于去掉重復(fù)的元素
     */
    @Test
    public void distinct(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        List<String> distincted = list.stream().distinct().collect(Collectors.toList());
        System.out.println(distincted);
    }
3.limit
/**
     * 用于獲取前n個元素
     */
    @Test
    public void limit(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        List<String> limited = list.stream().limit(3).collect(Collectors.toList());
        System.out.println(limited);
    }
4.skip
    /**
     * 用于獲取除前n個元素以外的所有元素
     */
    @Test
    public void skip(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        List<String> skiped = list.stream().skip(3).collect(Collectors.toList());
        System.out.println(skiped);
    }
5.map
    /**
     * 用于對所有元素進行集體的操作
     */
    @Test
    public void map(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        List<String> mapped = list.stream().map(str->"帥哥姓名是->"+str).collect(Collectors.toList());
        System.out.println(mapped);
    }

對流中的每一個元素進行處理

6.flatmap
/**
     * 用于對所有元素進行扁平化的操作
     */
    @Test
    public void flatMap(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        List<Character> flatMaped = list.stream().flatMap(str -> javaStream.getCharacter(str)).collect(Collectors.toList());
        System.out.println(flatMaped);
    }

    //創(chuàng)建了一個字符流轉(zhuǎn)換的方法
    public static Stream<Character> getCharacter(String str){
        ArrayList<Character> list = new ArrayList<>();
        for (Character character : str.toCharArray()) {
                list.add(character);
        }
        return list.stream();
    }

流扁平化,讓你把一個流中的“每個值”都換成另一個流摄闸,然后把所有的流連接起來成為一個流總結(jié): map是對一級元素進行操作善镰,flatmap是對二級元素操作。

7.sorted
/**
     * 用于對所有元素進行以a到z順序進行排序
     */
    @Test
    public void sorted(){
        //---------------------------字母排序-------------------------------------
        List<String> list = Arrays.asList("abc","sd","as","few","wth","dfg","as");
        List<String> sorted = list.stream().sorted().collect(Collectors.toList());//正序
        List<String> collect1 = list.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.US))).collect(Collectors.toList());
        System.out.println(sorted);
        System.out.println(collect1);
        //---------------------------漢字排序-------------------------------------
       List<String> list3 = Arrays.asList("呂布","劉備","阿斗","趙云","張遼","馬超","法正");
        List<String> sorted1 = list3.stream().sorted(Collator.getInstance(Locale.CHINA)).collect(Collectors.toList());//正序
        List<String> collect2 = list3.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.CHINA))).collect(Collectors.toList());
        System.out.println(sorted1);
        System.out.println(collect2);
        //---------------------------數(shù)字排序-------------------------------------
        List<Integer> list1 = Arrays.asList(1,5,9,54,33,-52,54);
        List<Integer> collect = list1.stream().sorted().collect(Collectors.toList());//正序
        Stream<Integer> sorted2 = list1.stream().sorted(Collections.reverseOrder());//反序
        System.out.println(collect);
        sorted2.forEach(s-> System.out.print(s+","));
    }

image.png

and so on


結(jié)束操作符例子

1.anyMatch
    /**
     * 用于判斷集合中是否有一個元素滿足條件
     */
    @Test
    public void anyMatch(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        boolean a = list.stream().anyMatch(s -> s.contains("峰"));
        System.out.println(a);

2.allMatch
    /**
   * 用于判斷集合中是否所有元素都滿足條件
     */
    @Test
    public void allMatch(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        boolean a = list.stream().allMatch(s -> s.contains("峰"));
        System.out.println(a);
    }

3.forEach
    /**
     * 用于循環(huán)
     */
    @Test
    public void forEach(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        list.stream().forEach(s -> System.out.println(s));
    }

4.collect
  /**
     * 用于將流轉(zhuǎn)換成其他類型的數(shù)據(jù):list年枕,map炫欺,set
     */
    @Test
    public void collect(){
         List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        Set<String> collect = list.stream().collect(Collectors.toSet());
        System.out.println(collect);

    }


5.count
  /**
     * 獲取集合中元素的數(shù)量
     */
    @Test
    public void count(){
        List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
        long count = list.stream().count();
        System.out.println(count);
    }



6.groupingBy
     /*分組*/
     public static void group(){
        Map<Integer, List<User>> map = users().stream()
                .collect(Collectors.groupingBy(User::getSex));
        System.out.println(new Gson().toJson(map));
        System.out.println();
        Map<Integer, Map<Integer,List<User>>> map2 = users().stream()
                .collect(Collectors.groupingBy(User::getSex,
                        Collectors.groupingBy(User::getAge)));
        System.out.println(new Gson().toJson(map2));
    }
7.maxBy、minBy
 public static void max_min(){
        List<User> list = users();
        Optional<User> max = list.stream()
                .collect(
                        Collectors.maxBy(
                                Comparator.comparing(User::getAge)
                        )
                );
        Optional<User> min = list.stream()
                .collect(
                        Collectors.minBy(
                                Comparator.comparing(User::getAge)
                  )
                );
        System.out.println("max--> " + max+"  min--> "+ min);

and so on


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熏兄,一起剝皮案震驚了整個濱河市品洛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摩桶,老刑警劉巖桥状,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異硝清,居然都是意外死亡辅斟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門芦拿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來士飒,“玉大人查邢,你說我怎么就攤上這事〗湍唬” “怎么了扰藕?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芳撒。 經(jīng)常有香客問我邓深,道長,這世上最難降的妖魔是什么笔刹? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任芥备,我火速辦了婚禮,結(jié)果婚禮上徘熔,老公的妹妹穿的比我還像新娘门躯。我一直安慰自己,他們只是感情好酷师,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布讶凉。 她就那樣靜靜地躺著,像睡著了一般山孔。 火紅的嫁衣襯著肌膚如雪懂讯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天台颠,我揣著相機與錄音褐望,去河邊找鬼。 笑死串前,一個胖子當(dāng)著我的面吹牛瘫里,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荡碾,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谨读,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坛吁?” 一聲冷哼從身側(cè)響起劳殖,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拨脉,沒想到半個月后哆姻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡玫膀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年矛缨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡劳景,死狀恐怖誉简,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盟广,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布瓮钥,位于F島的核電站筋量,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碉熄。R本人自食惡果不足惜桨武,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锈津。 院中可真熱鬧呀酸,春花似錦、人聲如沸琼梆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茎杂。三九已至错览,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煌往,已是汗流浹背倾哺。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刽脖,地道東北人羞海。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像曲管,于是被迫代替她去往敵國和親却邓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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