java 1.8 Stream

  • stream:
    • 是數據渠道,用於操作數據源(數組,集合等.)所產生的元素序列
      • 集合講的是數據,流講的是計算.
      • 並行: parallel
    • 注意:
      • stram 自己不會存儲元素.
      • stream 不會改變源對象,相反 他們會返回一個持有結果的新stream.
      • stream 操作是延遲執行的,這意味着他們會等到需要結果的時候才執行.
    • 使用步驟:
      • 1.創建stream
      • 2.中間操作
      • 3.終止操作
        • 注意:中間操作 不會執行任何操作,只有在終止操作的時候纔會一次性執行.
        • 多箇中間操作可以連接起來形成一個流水線,除非流水線上出發終止操作,否則中間操作不會執行任何處理.而在終止操作時一次性全部處理.稱爲 "惰性求值".
    •     public static void main(String[] args) {
              //可以通過Collection系列集合提供的stream() 串行 或 parallelStream() 並行
              List<String> list = new ArrayList<>();
              Stream<String> stream = list.stream();
      
              //通過Arrays中的靜態方法stream()獲取 數組流
              LoginRequest[] loginRequests = new LoginRequest[10];
              Stream<LoginRequest> stream1 = Arrays.stream(loginRequests);
      
              //通過stream類中的靜態方法of()
              Stream<String> aa = Stream.of("aa");
      
              //創建 無限流
                  //迭代
              Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2);
              //iterate.limit(10) 就是中間操作
              //forEach(System.out::println) 就是終止操作
              iterate.limit(10).forEach(System.out::println);
          }
      

       

    • 中間操作:

      • 篩選與切片

        • filter  接收lambda, 從六中排除某些元素

        • limit  截斷流.使其元素不超過給定數量

        • skip(n) 跳過元素,返回一個扔掉了前n個元素的流,若流中元素不足n個,則返回一個空流,與limit互補

        • distinct 篩選(去重),通過流所生成元素的hashCode()和equals()去除重複元素

      • filter  篩選:

        • static List<LoginRequest> loginRequests = Arrays.asList(
                      new LoginRequest("張三", "1111", "11"),
                      new LoginRequest("李四", "2222", "22"),
                      new LoginRequest("王五", "3333", "33"),
                      new LoginRequest("趙六", "6666", "66")
              );
          
              /**
               * @Description: filter  篩選
               * @Param: [args]
               * @return: void
               * @Author: 單人影
               * @Date: 2019/12/8 0008 15:59
               */
              public static void main(String[] args) {
                  Stream<LoginRequest> loginRequestStream = loginRequests.stream().filter((e) -> "22".equals(e.getAge()));
                  loginRequestStream.forEach(System.out::println);
              }

           

      • limit截斷:

        •  static List<LoginRequest> loginRequests = Arrays.asList(
                      new LoginRequest("張三", "1111", "11"),
                      new LoginRequest("李四", "2222", "22"),
                      new LoginRequest("王五", "3333", "33"),
                      new LoginRequest("趙六", "6666", "66")
              );
          
              /**
               * @Description: limit截斷
               * @Param: [args]
               * @return: void
               * @Author: 單人影
               * @Date: 2019/12/8 0008 15:59
               */
              public static void main(String[] args) {
                  loginRequests.stream()
                          .filter((e) -> Integer.valueOf(e.getAge()) > 11)
                          .limit(2)
                          .forEach(System.out::println);
              }
          
          控制檯:
          LoginRequest{userName='李四', passWord='2222', age='22'}
          LoginRequest{userName='王五', passWord='3333', age='33'}

           

      • skip 跳過:

        •   static List<LoginRequest> loginRequests = Arrays.asList(
                      new LoginRequest("張三", "1111", "11"),
                      new LoginRequest("李四", "2222", "22"),
                      new LoginRequest("王五", "3333", "33"),
                      new LoginRequest("趙六", "6666", "66")
              );
          
              /**
               * @Description: skip 跳過
               * @Param: [args]
               * @return: void
               * @Author: 單人影
               * @Date: 2019/12/8 0008 15:59
               */
              public static void main(String[] args) {
                  loginRequests.stream()
                          .filter((e) -> Integer.valueOf(e.getAge()) > 11)
                          .skip(2)
                          .forEach(System.out::println);
              }
          
          控制檯:
          LoginRequest{userName='趙六', passWord='6666', age='66'}

           

      • distinct 去重

        • static List<LoginRequest> loginRequests = Arrays.asList(
                      new LoginRequest("張三", "1111", "11"),
                      new LoginRequest("張三", "1111", "11"),
                      new LoginRequest("張三", "1111", "11"),
                      new LoginRequest("李四", "2222", "22"),
                      new LoginRequest("王五", "3333", "33"),
                      new LoginRequest("趙六", "6666", "66")
              );
          
              /**
               * @Description: distinct 去重
               * @Param: [args]
               * @return: void
               * @Author: 單人影
               * @Date: 2019/12/8 0008 15:59
               */
              public static void main(String[] args) {
                  loginRequests.stream()
                          .filter((e) -> Integer.valueOf(e.getAge()) > 1)
                          .distinct()
                          .forEach(System.out::println);
              }
          
          要重寫對象的equals和hashCode方法.
          控制檯:
          LoginRequest{userName='張三', passWord='1111', age='11'}
          LoginRequest{userName='李四', passWord='2222', age='22'}
          LoginRequest{userName='王五', passWord='3333', age='33'}
          LoginRequest{userName='趙六', passWord='6666', age='66'}

           

    • 映射:

      • map 接受lambda,講元素轉成其他形式或提取信息,接受一個函數作爲參數,該函數會被應用到每一個元素上,並將其映射成一個新的元素.

      • flagMap 接收一個函數作爲參數,將流中的每一個值都轉換成另一個流,然後把所有的流了解成一個流.

      •     /**
             * @Description: 映射 map
             * @Param: [args]
             * @return: void
             * @Author: 單人影
             * @Date: 2019/12/8 0008 15:59
             */
            public static void main(String[] args) {
                List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
                list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);
            }
        
        控制檯:
        AAA
        BBB
        CCC
        DDD
        
        
            /**
             * @Description: 映射 flatMap
             * @Param: [args]
             * @return: void
             * @Author: 單人影
             * @Date: 2019/12/8 0008 15:59
             */
            public static void main(String[] args) {
                list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);
                System.out.println("----------------------------------");
                //正常的map取值
                Stream<Stream<Character>> streamStream = list.stream().map(Test::filter);
                //使用flatMap 都放到flagMap中
                Stream<Character> characterStream = list.stream().flatMap(Test::filter);
                characterStream.forEach(System.out::println);
        
            }
        
            public static Stream<Character> filter(String string) {
                List<Character> list = new ArrayList();
                for (Character character : string.toCharArray()) {
                    list.add(character);
                }
                return list.stream();
            }
        
        總結:map相當於把一個個流加到map這個大流中.
            flatMap 相當於把流中的一個個元素加到flatMap流中

         

    • 排序:

      • sorted()  自然排序

      • sorted(Comparator com) 定製排序

      •  static List<LoginRequest> loginRequests = Arrays.asList(
                    new LoginRequest("張三", "1111", "11"),
                    new LoginRequest("張三1", "1113", "11"),
                    new LoginRequest("張三2", "1112", "11"),
                    new LoginRequest("李四", "2222", "22"),
                    new LoginRequest("王五", "3333", "33"),
                    new LoginRequest("趙六", "6666", "66")
            );
            static List<String> list = Arrays.asList("aaa", "ccc", "ddd", "bbb");
        
        
            /**
             * @Description: 排序 sorted
             * @Param: [args]
             * @return: void
             * @Author: 單人影
             * @Date: 2019/12/8 0008 15:59
             */
            public static void main(String[] args) {
                list.stream().sorted().forEach(System.out::println);
                //控制檯 aaa bbb ccc ddd
                loginRequests.stream().sorted((x, y) -> {
                            //年齡相同 比密碼
                            if (x.getAge().equals(y.getAge())) {
                                return x.getPassWord().compareTo(y.getPassWord());
                            } else {
                                //直接比年齡
                                return Integer.valueOf(x.getAge()).compareTo(Integer.valueOf(y.getAge()));
        //倒敘 return -Integer.valueOf(x.getAge()).compareTo(Integer.valueOf(y.getAge()));
                            }
                        }
                ).forEach(System.out::println);
            }
        
        控制檯:
        LoginRequest{userName='張三', passWord='1111', age='11'}
        LoginRequest{userName='張三2', passWord='1112', age='11'}
        LoginRequest{userName='張三1', passWord='1113', age='11'}
        LoginRequest{userName='李四', passWord='2222', age='22'}
        LoginRequest{userName='王五', passWord='3333', age='33'}
        LoginRequest{userName='趙六', passWord='6666', age='66'}

         

    • 終止:

      • 查找與匹配:

        • allMatch 檢查是否匹配所有元素

        • anyMatch 檢查是否至少匹配一個元素

        • noneMatch 檢查是否沒有匹配的所有元素

        • findFirst 返回第一個元素

        • finaAny 返回當前流中的任意元素

        • count 返回流中元素的總個數

        • max 返回流中最大值

        • min 返回流中最小值

      •     static List<LoginRequest> loginRequests = Arrays.asList(
                    new LoginRequest("張三", "1111", "11"),
                    new LoginRequest("張三1", "1113", "11"),
                    new LoginRequest("張三2", "1112", "11"),
                    new LoginRequest("李四", "2222", "22"),
                    new LoginRequest("王五", "3333", "33"),
                    new LoginRequest("趙六", "6666", "66")
            );
        
            /**
             * @Description: 查找匹配
             * @Param: [args]
             * @return: void
             * @Author: 單人影
             * @Date: 2019/12/8 0008 15:59
             */
            public static void main(String[] args) {
                boolean b = loginRequests.stream().allMatch((x) -> x.getPassWord().equals("111111"));
                System.out.println(b);
                //其餘的匹配用法基本相同
        
                //findFirst
                Optional<LoginRequest> optional = loginRequests.stream().sorted((x, y) -> x.getAge().compareTo(y.getAge())).findFirst();
                //Optional是爲了放置空指針 如果爲空就用orElse()括號裏面的.
                LoginRequest loginRequest1 = new LoginRequest("111", "222", "333");
                LoginRequest loginRequest = optional.orElse(loginRequest1);
                System.out.println(loginRequest.toString());
        
            }
        
        控制檯:
        false
        LoginRequest{userName='張三', passWord='1111', age='11'}

         

    • 歸約 reduce(T identity,BinaryOperator ) /  reduct(BinaryOperator)  可以將流中元素反覆結合起來,得到一個值.

      •     /**
             * @Description: 歸約 reduce
             * @Param: [args]
             * @return: void
             * @Author: 單人影
             * @Date: 2019/12/8 0008 15:59
             */
            public static void main(String[] args) {
                List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
                Integer reduce = list.stream().reduce(0, (x, y) -> x + y);
                System.out.println(reduce);
                System.out.println("================================");
                //有可能返回爲空的都是Optional ,因爲上面指定了起始值.不可能爲空.
                Optional<String> reduce1 = loginRequests.stream().map(LoginRequest::getUserName).reduce((x, y) -> x += (y));
                System.out.println(reduce1);
            }
        
        控制檯:
        15
        ================================
        Optional[張三張三1張三2李四王五趙六]

         

    • 收集: collect 將流轉換爲其他形式,接受一個collector接口的實現,用於給stream中元素做彙總的方法. (分組)

      •     static List<LoginRequest> loginRequests = Arrays.asList(
                    new LoginRequest("張三", "1111", "11"),
                    new LoginRequest("張三1", "1113", "11"),
                    new LoginRequest("張三2", "1112", "11"),
                    new LoginRequest("李四", "2222", "22"),
                    new LoginRequest("王五", "3333", "33"),
                    new LoginRequest("趙六", "6666", "66")
            );
            static List<String> list = Arrays.asList("aaa", "ccc", "ddd", "bbb");
        
        
            /**
             * @Description: 收集 collect
             * @Param: [args]
             * @return: void
             * @Author: 單人影
             * @Date: 2019/12/8 0008 15:59
             */
            public static void main(String[] args) {
                List<String> collect = loginRequests.stream().map(LoginRequest::getUserName).collect(Collectors.toList());
                System.out.println(collect.toString());
                Set<String> collects= loginRequests.stream().map(LoginRequest::getAge).collect(Collectors.toSet());
                System.out.println(collects.toString());
                //分組 groupingBy  還可以多級分組
                Map<String, List<LoginRequest>> collect1 = loginRequests.stream().collect(Collectors.groupingBy(LoginRequest::getAge));
                System.out.println(collect1.toString());
                //還可以分區.true一個區 false一個區 Collectors.partitioningBy
                //連接 Collectors.join()      可以寫成join(",") 逗號拼接
               
            }
        
        控制檯:
        [張三, 張三1, 張三2, 李四, 王五, 趙六]
        [11, 22, 33, 66]
        {66=[LoginRequest{userName='趙六', passWord='6666', age='66'}], 33=[LoginRequest{userName='王五', passWord='3333', age='33'}], 22=[LoginRequest{userName='李四', passWord='2222', age='22'}], 11=[LoginRequest{userName='張三', passWord='1111', age='11'}, LoginRequest{userName='張三1', passWord='1113', age='11'}, LoginRequest{userName='張三2', passWord='1112', age='11'}]}
         
發佈了70 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章