在java8 中,有兩個最重要的改變,一個就是之前了解的Lmbda java8 (jdk 1.8) 新特性——Lambda ,還有一個就是Stream Api
1. 什么是Stream API
簡單來說就是一個類別庫,里邊有一些方法方便我們對集合資料進行操作,就好像使用 SQL 陳述句進行操作資料庫一樣
優點就是,使我們代碼簡潔更高效的處理資料,高效!!
官方java8 Api中文檔案 在公眾號內 回復關鍵字 【檔案】 獲取
一個完成的stream 流操作包含以下內容
-
一個資料源,資料源可以是集合,陣列
-
中間鏈的操作 (比如 過濾, 去重,排序 等等)
-
終止操作,產生一個結果(比如重新收集成集合)
例如:
List<UserInfo> userInfoList =new ArrayList<>(); userInfoList.add(new UserInfo(1,"張三",23)); userInfoList.add(new UserInfo(2,"李四",25)); userInfoList.add(new UserInfo(3,"王五",24)); userInfoList.add(new UserInfo(4,"趙六",26)); List<String> collect = userInfoList.stream().filter(info->info.getAge()>=25).map(UserInfo::getName).collect(Collectors.toList());

2. Stream 實體化
-
通過集合創建順序流 . stream 【常用】
Stream<UserInfo> stream = userInfoList.stream();
-
通過集合創建并行流 . stream
Stream<UserInfo> parallelStream = userInfoList.parallelStream();
這兩個流的區別在初篇也有簡單的介紹:java8 (jdk 1.8) 新特性 ——初步認識
-
通過陣列
int[] ids ={1,2,3,4,5}; IntStream stream = Arrays.stream(ids);
- Stream.of() 【常用】
Stream<Integer> ids1 = Stream.of(1,2,3,4,5);
2. 常用操作 (重點)
Api中常用的操作有很多,這邊就列舉一些作業中會使用到的
資料源:
List<UserInfo> userInfoList =new ArrayList<>();
userInfoList.add(new UserInfo(1,"張三",23));
userInfoList.add(new UserInfo(2,"李四",25));
userInfoList.add(new UserInfo(3,null,24));
userInfoList.add(new UserInfo(4,"趙六",26));
- 過濾 (filter)
過濾獲取名字不為空的資料
userInfoList.stream().filter(info -> Objects.nonNull(info.getName())).forEach(System.out::println);

- 獲取其中一個屬性集 (map)
獲取所有用戶的名字集
userInfoList.stream().map(UserInfo::getName).forEach(System.out::println);
如果加上過濾 不為null資料
先過濾后過濾回傳的結果集都是一樣的
先map 后 filter
userInfoList.stream().map(UserInfo::getName).filter(Objects::nonNull).forEach(System.out::println);
先filter后 map ,代碼量明顯增多,所以在操作前可以思考一下,哪一種更好一點
userInfoList.stream().filter(info -> Objects.nonNull(info.getName())).map(UserInfo::getName).forEach(System.out::println);

- 排序 (sorted)

按照年齡排序 (默認正序,從小到大)
userInfoList.stream().sorted(Comparator.comparing(UserInfo::getAge)).forEach(System.out::println);

倒序(從大到小),加個reversed() 就好了
userInfoList.stream().sorted(Comparator.comparing(UserInfo::getAge).reversed()).forEach(System.out::println);

-
計算 (reduce)
出現金額計算的時候,一般電商,庫存系統 經常用得到
這邊演示我就不新建一個類了(偷懶),把年齡型別直接改成 BigDecimal 注意:跟錢相關的型別都得用 BigDecimal 不要用double,精度會丟失,這可是錢,計算丟了一毛錢,財務都得奔潰

List<UserInfo> userInfoList =new ArrayList<>();
userInfoList.add(new UserInfo(1,"張三",new BigDecimal("32")));
userInfoList.add(new UserInfo(2,"李四",new BigDecimal("50")));
userInfoList.add(new UserInfo(3,null,new BigDecimal("40")));
userInfoList.add(new UserInfo(4,"趙六",new BigDecimal("30")));
BigDecimal bigDecimal = userInfoList.stream().map(UserInfo::getAge).reduce(BigDecimal::add).orElse(new BigDecimal("0"));
System.out.println(bigDecimal);

- 轉Map 集合
將資料源轉為名稱,年齡map
Map<String, Integer> collect = userInfoList.stream().collect(Collectors.toMap(UserInfo::getName, UserInfo::getAge));
collect:就是將中間鏈操作后的結果進行處理 ,前面我們為了演示,都是進行forEach 進行列印輸出,在作業中,都是用collect 進行收集成新的集合,或者其他資料形式
就比如: 獲取所有姓名集合
List<String> collect = userInfoList.stream().map(UserInfo::getName).collect(Collectors.toList());
有這么多種處理結果的方式

用的最多的就是
1. .collect(Collectors.toList())
2. .collect(Collectors.toMap(,,,,,))
3. .collect(Collectors.groupingBy(,,,,,))
-
分組 groupingBy
按照年齡分組
List<UserInfo> userInfoList =new ArrayList<>();
userInfoList.add(new UserInfo(1,"張三",23));
userInfoList.add(new UserInfo(2,"李四",23));
userInfoList.add(new UserInfo(3,null,24));
userInfoList.add(new UserInfo(4,"趙六",26));
Map<Integer, List<UserInfo>> collect = userInfoList.stream().collect(Collectors.groupingBy(UserInfo::getAge));
collect.forEach((k,v) -> System.out.println("鍵:"+k+"......值:"+v));

其他API也很常用,建議隨時看看Api檔案,有個印象,遇到有需要使用的時候就能快速定位了
最后!! 記得公眾號內回復 關鍵字【檔案】 獲取 java8 api 中英文,雙倍快樂


java8 (jdk 1.8) 新特性—— 方法參考+構造器參考
java8 (jdk 1.8) 新特性——Lambda
java8 (jdk 1.8) 新特性 ——初步認識
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/537987.html
標籤:Java
