一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Java進階 之 Stream流

 hncdman 2023-07-09 發(fā)布于湖南

華同學.

于 2022-08-03 10:15:07 發(fā)布

1686

 收藏 2

分類專欄: 練習 文章標簽: java

版權

練習

專欄收錄該內(nèi)容

13 篇文章0 訂閱

訂閱專欄

Stream流思想:

就相當于流水線一樣,一道工序一道工序的進行排查,得出最后結(jié)果。

1.創(chuàng)建Stream流對象

1.1單列集合創(chuàng)建Stream流

//        單列 創(chuàng)建Stream   List 可重復的

        List<String> list = List.of("張三","李四","王五");

        Stream<String> stream1 = list.stream();

//        單列不可重復的

        Set<String> set = Set.of("張三","李四","王五");

        Stream<String> stream2 = set.stream();

1.2雙列集合創(chuàng)建Stream流對象 

//        雙列  不能直接產(chǎn)生Stream流對象,而是通過先轉(zhuǎn)單

        Map<String, Integer> map = Map.of("張三", 19, "李四", 30);

        Set<String> set1 = map.keySet();

        Stream<String> stream = set1.stream();

 注意:雙列集合不能直接創(chuàng)建Stream流對象,要用它的 keySet()方法 獲取到單列集合。

 3.數(shù)組  創(chuàng)建流對象

//        數(shù)組

        int[] arr = {1,2,3};

        IntStream stream3 = Arrays.stream(arr);

 數(shù)組要通過它的Arrays工具類 進行創(chuàng)建 Stream流。

4.相同類型;

  Stream<String> stream4 = Stream.of("張三", "李四", "王五", "趙六");

2.Stream流常用方法

1.中間方法

概念:執(zhí)行完此方法之后,Stream流依然可以繼續(xù)執(zhí)行其他操作

方法名 說明

Stream<T> filter(Predicate predicate) 用于對流中的數(shù)據(jù)進行過濾

Stream<T> limit(long maxSize) 返回此流中的元素組成的流,截取前指定參數(shù)個數(shù)的數(shù)據(jù)

Stream<T> skip(long n) 跳過指定參數(shù)個數(shù)的數(shù)據(jù),返回由該流的剩余元素組成的流

static <T> Stream<T> concat(Stream a, Stream b) 合并a和b兩個流為一個流

Stream<T> distinct()

返回由該流的不同元素(根據(jù)Object.equals(Object) )組成的流

Stream<T> sorted() 返回由此流的元素組成的流,根據(jù)自然順序排序

Stream<T> sorted(Comparator comparator) 返回由該流的元素組成的流,根據(jù)提供的Comparator進行排序

<R> Stream<R> map(Function mapper) 返回由給定函數(shù)應用于此流的元素的結(jié)果組成的流

IntStream mapToInt(ToIntFunction mapper) 返回一個IntStream其中包含將給定函數(shù)應用于此流的元素的結(jié)果

 展示幾個常用方法:

1.filter(s -> 關系表達式) 過濾   保留返回值為true 的

public class MyStream3 {

    public static void main(String[] args) {

//        Stream<T> filter(Predicate predicate):過濾

//        Predicate接口中的方法 boolean test(T t):對給定的參數(shù)進行判斷,返回一個布爾值

        ArrayList<String> list = new ArrayList<>();

        list.add("張三豐");

        list.add("張無忌");

        list.add("張翠山");

        list.add("王二麻子");

        list.add("張良");

        list.add("謝廣坤");

        //filter方法獲取流中的 每一個數(shù)據(jù).

        //而test方法中的s,就依次表示流中的每一個數(shù)據(jù).

        //我們只要在test方法中對s進行判斷就可以了.

        //如果判斷的結(jié)果為true,則當前的數(shù)據(jù)留下

        //如果判斷的結(jié)果為false,則當前數(shù)據(jù)就不要.

//        list.stream().filter(

//                new Predicate<String>() {

//                    @Override

//                    public boolean test(String s) {

//                        boolean result = s.startsWith("張");

//                        return result;

//                    }

//                }

//        ).forEach(s-> System.out.println(s));

        //因為Predicate接口中只有一個抽象方法test

        //所以我們可以使用lambda表達式來簡化

//        list.stream().filter(

//                (String s)->{

//                    boolean result = s.startsWith("張");

//                        return result;

//                }

//        ).forEach(s-> System.out.println(s));、

//最后簡化成

        list.stream().filter(s ->s.startsWith("張")).forEach(s-> System.out.println(s));

    }

}

 2.limit(n) 保留前n個   skip(n) 跳過 前n個

public class StreamDemo02 {

    public static void main(String[] args) {

        //創(chuàng)建一個集合,存儲多個字符串元素

        ArrayList<String> list = new ArrayList<String>();

        list.add("林青霞");

        list.add("張曼玉");

        list.add("王祖賢");

        list.add("柳巖");

        list.add("張敏");

        list.add("張無忌");

        //需求1:取前3個數(shù)據(jù)在控制臺輸出

        list.stream().limit(3).forEach(s-> System.out.println(s));

        System.out.println("--------");

        //需求2:跳過3個元素,把剩下的元素在控制臺輸出

        list.stream().skip(3).forEach(s-> System.out.println(s));

        System.out.println("--------");

        //需求3:跳過2個元素,把剩下的元素中前2個在控制臺輸出

        list.stream().skip(2).limit(2).forEach(s-> System.out.println(s));

    }

}

3.concat() 靜態(tài)方法 類名直接調(diào)用 連接    

distinct() 去重方法

public class StreamDemo03 {

    public static void main(String[] args) {

        //創(chuàng)建一個集合,存儲多個字符串元素

        ArrayList<String> list = new ArrayList<String>();

        list.add("林青霞");

        list.add("張曼玉");

        list.add("王祖賢");

        list.add("柳巖");

        list.add("張敏");

        list.add("張無忌");

        //需求1:取前4個數(shù)據(jù)組成一個流

        Stream<String> s1 = list.stream().limit(4);

        //需求2:跳過2個數(shù)據(jù)組成一個流

        Stream<String> s2 = list.stream().skip(2);

        //需求3:合并需求1和需求2得到的流,并把結(jié)果在控制臺輸出

//        Stream.concat(s1,s2).forEach(s-> System.out.println(s));

        //需求4:合并需求1和需求2得到的流,并把結(jié)果在控制臺輸出,要求字符串元素不能重復

        Stream.concat(s1,s2).distinct().forEach(s-> System.out.println(s));

    }

}

2.終結(jié)方法

常見方法

方法名 說明

void forEach(Consumer action) 對此流的每個元素執(zhí)行操作

long count() 返回此流中的元素數(shù)

public class MyStream5 {

    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<>();

        list.add("張三豐");

        list.add("張無忌");

        list.add("張翠山");

        list.add("王二麻子");

        list.add("張良");

        list.add("謝廣坤");

        //method1(list);

//        long count():返回此流中的元素數(shù)

        long count = list.stream().count();

        System.out.println(count);

    }

    private static void method1(ArrayList<String> list) {

        //  void forEach(Consumer action):對此流的每個元素執(zhí)行操作

        //  Consumer接口中的方法void accept(T t):對給定的參數(shù)執(zhí)行此操作

        //在forEach方法的底層,會循環(huán)獲取到流中的每一個數(shù)據(jù).

        //并循環(huán)調(diào)用accept方法,并把每一個數(shù)據(jù)傳遞給accept方法

        //s就依次表示了流中的每一個數(shù)據(jù).

        //所以,我們只要在accept方法中,寫上處理的業(yè)務邏輯就可以了.

        list.stream().forEach(

                new Consumer<String>() {

                    @Override

                    public void accept(String s) {

                        System.out.println(s);

                    }

                }

        );

        System.out.println("====================");

        //lambda表達式的簡化格式

        //是因為Consumer接口中,只有一個accept方法

        list.stream().forEach(

                (String s)->{

                    System.out.println(s);

                }

        );

        System.out.println("====================");

        //lambda表達式還是可以進一步簡化的.

        list.stream().forEach(s->System.out.println(s));

    }

}

注意:調(diào)用完終結(jié)方法就會直接關閉該流,不能再調(diào)用中間方法。

;分號也有終結(jié)的作用。

 3.Stream流的收集操作******

對數(shù)據(jù)使用Stream流的方式操作完畢后,可以把流中的數(shù)據(jù)收集到集合中

常用方法:

方法名 說明

R collect(Collector collector) 把結(jié)果收集到集合中

工具類Collectors提供了具體的收集方式

方法名 說明

public static <T> Collector toList() 把元素收集到List集合中

public static <T> Collector toSet() 把元素收集到Set集合中

public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

 1.收集到List集合

     List<Integer> list = List.of(1,2,3,4,5,6,7,8,9,10,10);

//收集成一個list集合

        Stream<Integer> stream = list.stream();

        List<Integer> list2 = stream.filter(s -> s % 2 == 0).collect(Collectors.toList());

        System.out.println(list2);

2.收集到Set集合

//        將數(shù)組去重 收集到 set集合中

        Stream<Integer> stream2 = list.stream();

        Set<Integer> set = stream2.filter(s -> s % 2 == 0).distinct().collect(Collectors.toSet());

        System.out.println(set);

3.收集到Map集合

ArrayList<String> list = new ArrayList<>();

        list.add("張三,25");

        list.add("李四,24");

        list.add("王五,21");

        list.add("趙六,28");

//        創(chuàng)建Map對象

        HashMap<String,Integer> map = new HashMap<>();

        Stream<String> stream = list.stream();

//        用Map接收

        Map<String, String> map1 = stream.filter(s -> {

//            截取字符串

            String[] strarr = s.split(",");

            String name = strarr[0];//獲取到名字

            int age = Integer.parseInt(strarr[1]);

            return age >= 24;

        }).collect(Collectors.toMap(

                s -> s.split(",")[0],

                s -> s.split(",")[1]

        ));

        System.out.println(map1);

文章知識點與官方知識檔案匹配,可進一步學習相關知識

————————————————

版權聲明:本文為CSDN博主「華同學.」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/weixin_50769390/article/details/126109476

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    91亚洲国产成人久久| 国产精品欧美一级免费| 草草夜色精品国产噜噜竹菊| 激情内射亚洲一区二区三区| 在线免费看国产精品黄片| 天堂热东京热男人天堂| 欧美午夜一级艳片免费看| 亚洲精品偷拍视频免费观看| 亚洲精品中文字幕一二三| 日本淫片一区二区三区| 精品老司机视频在线观看| 成人精品视频一区二区在线观看| 日韩成人午夜福利免费视频| 国产精品一区二区成人在线| 免费特黄一级一区二区三区| 国产av一区二区三区四区五区| 91亚洲精品亚洲国产| 香蕉尹人视频在线精品| 欧美在线观看视频三区| 九九热在线免费在线观看| 国产性情片一区二区三区| 免费一区二区三区少妇| 免费在线播放一区二区| 日韩女优视频国产一区| 欧美一区二区三区高潮菊竹| 三级理论午夜福利在线看| 久久国产精品亚州精品毛片| 欧美日韩国内一区二区| 麻豆国产精品一区二区三区| 国产精品九九九一区二区| 精品人妻一区二区三区免费| 亚洲av一区二区三区精品| 亚洲中文字幕在线视频频道| 99国产一区在线播放| 黄色在线免费高清观看| 亚洲一区二区三区av高清| 婷婷基地五月激情五月| 深夜视频成人在线观看| 99热九九在线中文字幕| 中文字幕乱码亚洲三区| 深夜福利亚洲高清性感|