一、什么叫流
tips:聰明的人只看紅字,其他的是我用來解釋Stream流的含義
- Stream不是集合框架,也不是資料結構,他不存盤資料,就好比一個工廠,從源頭接收原材料,進行加工,然后產出最終產品,在這個程序中,工廠不會存盤任何東西,同樣的Stream流只會對流資料進行處理并不會保存,流不存盤元素,它只是通過計算操作管道(或者從計算機的訊息佇列中)從資料結構、陣列或 I/O 通道等源傳輸元素,
- 工廠只會對源頭接收原材料,并不會把源頭的材料給改了,就好比一個生產手機的,源頭公司是生產芯片的,他不會把源頭公司的芯片變成了主板,同樣的Stream流只會接收資料進行處理,并不會改變源資料,流本質上是功能性的
- 工廠并不是不間斷生產,當原材料不足就會被迫停止生產,同樣的Stream流并不會主動去尋找資料,如果沒有資料流他就停在那里等待,我們叫他惰性,僅在需要時對流進行計算,流是惰性的
- 當原材料進入工廠,至于怎么加工源頭就管不著的,工廠可以按照自己方式進行生產,比如多建立幾條流水線,會提高工廠生產效率,同樣的Stream流也支持并行處理,如果需要的話,Stream流可以充分利用計算機資源并行處理這段資料,流具有并行處理的能力
- 當一個原材料被加工成最終產品時,它將無法恢復到原狀,即使在強大的工廠也無能為力,同樣的Stream流只是一次性的,就像迭代器一樣,當對流的處理結束,他將不能再執行一遍,在流的生命周期中,流的元素僅訪問一次,
二、流的目的
用于簡化集合和陣列的操作,三、流的使用
List<String> list = new ArrayList<>();
list.add("張三");
list.add("張三豐");
list.add("柳巖");
list.add("林青霞");
list.add("張曼玉");
//普通寫法
//找出“張”開頭的人物
list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("張");
}
}).forEach(s -> System.out.println(s));
//簡化寫法
//找出“張”開頭的人物,并且長度為3的人物
list.stream().filter(s->s.startsWith("a")).filter(s->s.length()==3).forEach(System.out::println);
1. 流的使用流程
資料源(source) -> 資料處理 / 轉換(intermedia) -> 結果處理(terminal)2. Stream的核心思想:
- 先得到集合或者陣列的Stream流物件,
- 把元素放進去
- 然后用Stream流簡化的API來操作元素
四、流的常用方法
1. 獲取Stream流
如果是陣列的話,可以使用 Arrays.stream() 或者 Stream.of() 創建流;如果是集合的話,可以直接使用 stream() 方法創建流,因為該方法已經添加到 Collection 介面中,
- Collection介面中的方法
| 方法 | 說明 |
default Stream<E> stream()
|
回傳以此集合為源的順序 Stream , |
- 通過陣列獲取方式,使用Arrays工具類中提供的方法
| 方法 | 說明 |
public static <T> Stream<T> stream(T[] array)
|
回傳以指定陣列作為源的順序 Stream , |
public static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive)
|
回傳以指定陣列,指定索引范圍作為源的順序 Stream , |
static <T> Stream<T> of?(T t)
|
回傳包含單個元素的Stream |
static <T> Stream<T> of?(T... values)
|
回傳其元素為指定值的順序Stream, |
2. 操作流
| 方法 | 說明 |
| Stream<T> filter(Predicate<? super T> predicate) | 回傳由與此給定謂詞匹配的此流的元素組成 的流, |
| Stream<T> limit(long maxSize) | 回傳由此流的元素組成的流,截斷長度不超 過 maxSize |
| Stream<T> skip(long n) | 在丟棄流的第一個 n 元素后,回傳由此流 的其余元素組成的流, |
| Stream<T> distinct() | 回傳由此流的不同元素(根據 Object.equals(Object) )組成的流, |
| static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) | 創建一個延遲連接的流,其元素是第一個流 的所有元素,后跟第二個流的所有元素, |
3. 終結方法
| 方法 | 說明 |
| void forEach(Consumer<? super T> action) | 對此流的每個元素執行操作, |
| long count() | 回傳此流中元素的數量, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547629.html
標籤:其他
上一篇:Maven 中<optional>true</optional>和<scope>provided</scope>之間的區別
