日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

跟我学 Java 8 新特性之 Stream 流基础体验

發布時間:2023/12/3 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跟我学 Java 8 新特性之 Stream 流基础体验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自? ?跟我學 Java 8 新特性之 Stream 流基礎體驗

Java8新增的功能中,要數lambda表達式和流API最為重要了.這篇文章主要介紹流API的基礎,也是流API系列的第一篇文章,話不多說,直奔主題.

什么是流API? 它能做一些什么?

我們應該知道(絕對知道~)API是一個程序向使用者提供的一些方法,通過這些方法就能實現某些功能.所以對于流API來說,重點是怎么理解"流"這個概念,所謂的流:就是數據的渠道,所以,流代表的是一個對象的序列.它和Java I/O類里使用的"流"不同.雖然在概念上與java.util.stream中定義的流是類似的,但它們是不同的.流API中的流是描述某個流類型的對象.

流API中的流操作的數據源,是數組或者是集合.它本身是不存儲數據的,只是移動數據,在移動過程中可能會對數據進行過濾,排序或者其它操作.但是,一般情況下(絕大數情況下),流操作本身不會修改數據源.比如,對流排序不會修改數據源的順序.相反,它會創建一個新的流,其中包含排序后的結果.

從一個簡單的例子,體驗流API的強大與優雅

這個簡單的Demo,主要是對一個由1-6亂序組成的List對應的流進行操作,然后通過這個流,就可以獲取到列表里面最大最小值,排序,過濾某些元素等等的操作.并且這此操作不會改變原List里面的數據.Demo里面需要注意的地方就是流API里面的"終端操作"和"中間操作"的區別:其實也很簡單,終端操作會消費流,一個被消費過的流是不能被再次利用的,但我們在實際應用的時候,并不會受到太大的影響(Ps:如果你們能動手實踐一下我相信你體驗更好,強烈推薦!)

public class Main {public static void main(String[] args) {learnStream();}private static void learnStream() {//首先,創建一個1-6亂序的ListList<Integer> lists = new ArrayList<>();lists.add(4);lists.add(3);lists.add(6);lists.add(1);lists.add(5);lists.add(2);//看看List里面的數據是什么樣子的先System.out.print("List里面的數據:");for (Integer elem : lists) System.out.print(elem + " ");// 4 3 6 1 5 2System.out.println();//最小值System.out.print("List中最小的值為:");Stream<Integer> stream = lists.stream();Optional<Integer> min = stream.min(Integer::compareTo);if (min.isPresent()) {System.out.println(min.get());//1}//最大值System.out.print("List中最大的值為:");lists.stream().max(Integer::compareTo).ifPresent(System.out::println);//6//排序System.out.print("將List流進行排序:");Stream<Integer> sorted = lists.stream().sorted();sorted.forEach(elem -> System.out.print(elem + " "));// 1 2 3 4 5 6System.out.println();//過濾System.out.print("過濾List流,只剩下那些大于3的元素:");lists.stream().filter(elem -> elem > 3).forEach(elem -> System.out.print(elem + " "));// 4 5 6System.out.println();//過濾System.out.println("過濾List流,只剩下那些大于0并且小于4的元素:\n=====begin=====");lists.stream().filter(elem -> elem > 0).filter(elem -> elem < 4).sorted(Integer::compareTo).forEach(System.out::println);// 1 2 3System.out.println("=====end=====");//經過了前面的這么多流操作,我們再來看看List里面的值有沒有發生什么改變System.out.print("原List里面的數據:");for (Integer elem : lists) System.out.print(elem + " ");// 4 3 6 1 5 2} }? ?

如果剛才的Demo你認真讀了,我相信你心里面多多少少都會產生一點點漣漪.沒錯,流API結合lambda表達式,就是這么優美!下面我詳細介紹一下整個Demo,讓大家更加清淅:

最小值

//最小值 System.out.print("List中最小的值為:"); Stream<Integer> stream = lists.stream(); Optional<Integer> min = stream.min(Integer::compareTo); if (min.isPresent()) {System.out.println(min.get());//1 }

首先通過stream()方法獲取List對應的流,如果你對Java8的集合框架有一定的了解,你應該知道stream()是由Collection接口提供的.然后就可以通過min()獲取流中的最小值了,當然這個流中的最小值肯定也是List里面的最小值.

min()方法接收一個Comparator類型的參數,這個比較器是用于比較流中的兩個元素的.我們這里把Integer的compareTo()的引用傳遞給了min().它返回的類型是Optional,Optional可謂是NullPointException的大殺器啊,感興趣的同學,了解一下.然后判斷最小值存不存在,如果存在,就通過Optional的get()讀取出來.很簡單有木有!

最大值

//最大值 System.out.print("List中最大的值為:"); lists.stream().max(Integer::compareTo).ifPresent(System.out::println);//6

語法糖爽YY有木有,不過需要注意的一點,因為min()是一個終端操作,所以這個流是不可以再用了,因此我們需要通過stream()重新生成一個流,(但這其實并不影響我們的實際生產的:①方法功能單一原則②還有其它很多很強大的方法組合能讓你實現各種功能啊.)ifPresent其實和上面的最小值的if判斷是一定要,如果存在最大值,我們就打印一下,這里只不過用了一些函數式寫法而已.

排序和遍歷

//排序 System.out.print("將List流進行排序:"); Stream<Integer> sorted = lists.stream().sorted(); sorted.forEach(elem -> System.out.print(elem + " "));// 1 2 3 4 5 6

通過上面的講解,相信這個已經難不了你了,sorted()方法是用于排序的,它的一個重載方法可以接收一個Comparator類型的參數,讓你自定義你的排序規則.forEach方法就遍歷.

過濾

//過濾 System.out.println("過濾List流,只剩下那些大于0并且小于4的元素:\n=====begin====="); lists.stream().filter(elem -> elem > 0).filter(elem -> elem < 4).sorted(Integer::compareTo).forEach(System.out::println);// 1 2 3 System.out.println("=====end=====");

filter()是基于一個謂詞過濾流,它返回一個只包含滿足謂詞的元素的新流.它的參數形式是Predicate,是在java.util.function包下的泛型函數式接口.并且filter是一個中間操作,而且還可以同時存在多個filter.這里的兩個過濾器,我們都傳遞了lambda表達式.

小結一下

其實基本的流API使用就是這么簡單,結合lambda表達式后,一切都變得特別清淅.這個簡單的Demo展示了一些基礎的功能,它或許就擴展了你操作數組或者集合框架的思路,讓你操作集合和數組,變得更加的容易,簡單和高效.當然流API的的功能肯定不止這一點點,我會陸陸續續完善整個系列,大家跟著我的步伐,就這一次,踏踏實實學好流式API,走向人生巔峰,迎娶白富美!

總結

以上是生活随笔為你收集整理的跟我学 Java 8 新特性之 Stream 流基础体验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。