1. 程式人生 > 其它 >開發神器,拿走不謝【Java8 Stream】

開發神器,拿走不謝【Java8 Stream】

技術標籤:javajava

每一種開發語言都提供了豐富的工具庫,作為當今最流行的的開發語言之一,Java肯定也不例外。

但是今天不講Java集合工具類,我們來講講Java8的特性之一 Stream。用好Stream,可以極大提高我們的開發效率,好了開始今天的課程~

java8流操作來自林老師帶你學程式設計00:0000:46收錄於話題#java2個

一、迴圈過濾

我們平常開發最經常使用的就是迴圈、排序、統計之類的,下面我們以一個實際的例子來演示說明。

從一個List過濾空字串並輸出不含空字元的資料

List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = new ArrayList<>();
for (String str : stringList) {
    if (!str.isEmpty()) {
        filtered.add(str);
    }
}
System.out.println(filtered.toString());

傳統的程式碼必須通過迴圈來實現,需要寫一堆的程式碼來判斷組裝,非常麻煩,下面我們來看看Stream的實現。

List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = stringList.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println(filtered.toString());

簡簡單單兩行程式碼就可以實現了,非常簡單。

二、資料統計

在平常開發過程中,很經常需要對資料進行彙總操作,例如我們將一個整數集合中所有資料疊加並輸出。

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (Integer num : numList) {
    sum += num;
}
System.out.println(sum);

採用Stream兩行就搞定了。

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5);
int sum = numList.stream().reduce(Integer::sum).orElse(0);
System.out.println(sum);

上面的例子是集合本身就是Integer型別,如果本身是物件呢?

List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(1);
User user2 = new User();
user2.setAge(2);
userList.add(user1);
userList.add(user2);
int sum = userList.stream().mapToInt(User::getAge).sum();
System.out.println(sum);

對集合物件的某一個屬性進行欄位求和也很簡單,兩行程式碼搞定。

三、分組彙總

下面再來說一個更騷的操作,我們平常處理資料的時候,經常需要對資料進行分組求和,例如這樣一個場景,一個List中儲存了很多的使用者資料,現在需要統計:性別男的平均年齡和性別女的平均年齡,我們先來看看傳統的實現。

List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(10);
user1.setSex('男');
User user2 = new User();
user2.setAge(20);
user2.setSex('男');
User user3 = new User();
user3.setAge(5);
user3.setSex('女');
User user4 = new User();
user4.setAge(15);
user4.setSex('女');
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
int boyAverageAge = 0, boyTotalAge = 0,boyNum = 0;
int girlAaverageAge = 0, girlTotalAge = 0, girlNum = 0;
for (User user : userList) {
    if (user.getSex() == '男') {
        boyTotalAge = boyTotalAge + user.getAge();
        boyNum++;
     } else {
         girlTotalAge = girlTotalAge + user.getAge();
         girlNum++;
     }
}
boyAverageAge = boyTotalAge/boyNum;
girlAaverageAge = girlTotalAge/girlNum;
System.out.println(boyAverageAge);
System.out.println(girlAaverageAge);

這拉皮條的程式碼真是太噁心了,接下來我們來看看Stream是如何化腐朽與神奇的。

Map<Character, Double> counting = userList.stream().collect(Collectors.groupingBy(User::getSex, Collectors.averagingInt(User::getAge)));
System.out.println(counting.get('男'));
System.out.println(counting.get('女'));

一行就可以搞定分組並求平均值的功能,相比我們自己寫迴圈去處理,採用Stream的方式至少可以提升兩倍的開發效率,總結一句就是非常強大、非常高效。

四、迴圈列印

開發過程中迴圈操作是一個最基本的操作,幾乎都會涉及到這個操作,傳統的迴圈操作想必大家都知道,我們來看看Stream是如何進行迴圈的。

例如我們想要輸出所有男孩的資訊,我們可以這樣做。

userList.stream().filter(n -> n.getSex() == '男').forEach(p -> System.out.println(p));

也是超級簡單,一行程式碼就可以搞定。

五、排序

最後我們再來看看Stream是如何實現排序的

 List<User> userSortList = userList.stream().sorted((p1, p2) -> p1.getAge() - p2.getAge()).collect(Collectors.toList());

排序有些人可能會迷糊p1.getAge() - p2.getAge()這行程式碼是什麼意思,它的含義是p1在前面就是順序(從小到大),p2在前面就是逆序(從大到小)。

六、總結

平時開發過程中,我們一定要善於使用各種工具,它可以幫助我們大大節省開發時間,就比如Stream,用的好的話,可以節省我們一半的開發時間。當然工具也不能濫用,不然可能會出現效能問題,下一期再給大家分享一波濫用工具導致效能問題的場景。

-----------------------

公眾號:林老師帶你學程式設計

網站:wolzq.com

程式碼無非增刪改查,關注老師給你Coding

圖片

林老師帶你學程式設計https://wolzq.com