目錄
一、Stream流概述
1、兩種周遊集合方式的比較
2、流式思想
個人了解的流式思想
Stream流是一個來自資料源的元素隊列
和Collection操作不同,Stream操作還有兩個基本特征:
當使用一個流的時候通常包括三個基本步驟:
二、擷取Stream流的兩種方式
1、所有的Collection集合都可以通過stream方法擷取流
代碼示範:
2、Stream接口的靜态方法of可以擷取數組對應的流
代碼示範:
三、Stream流的常用方法
1、常用方法分為兩類:
①延遲方法:
②終結方法:
2、forEach周遊
方法:
代碼示例:
3、fliter過濾
方法:
作用:
代碼實作:
注意:
代碼說明:
4、map映射
方法:
作用:
示範:
5、count計數
方法:
作用:
代碼示範:
6、limit截取前N個元素
方法:
作用:
代碼實作:
7、skip跳過前N個元素
方法:
作用:
代碼實作:
8、concat流的合并
方法:
作用:
代碼實作:
一、Stream流概述
1、兩種周遊集合方式的比較
package study.stream;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("張大哥");
list.add("李三哥");
list.add("張二哥");
list.add("馬五弟");
list.add("張六弟");
//需求:找出姓張的哥哥
//傳統方法
for (String s : list) {
if(s.startsWith("張")&&s.endsWith("哥")){
System.out.println(s);
}
}
//stream流的方式
list.stream()
.filter((s)->s.startsWith("張"))
.filter((s)->s.endsWith("哥"))
.forEach(System.out::println);
}
}
2、流式思想
個人了解的流式思想
Stream的作用是使對一些資料的操作更加友善、快捷;
就像工廠裡的生産線對産品進行多步驟加工,每一步加工之後傳回的還是産品本身,隻不過是加工過的産品,然後繼續下一步加工操作,就像上面的代碼,每一行代碼就相當于進行一次加工,加工後還是傳回産品本身,是以可以直接進行下一個方法調用;
Stream流是一個來自資料源的元素隊列
①元素是特定類型的對象,形成一個隊列;(在java中Stream并不會存儲資料,隻是進行按需計算)
②資料源:流的來源。可以是集合、數組等;
和Collection操作不同,Stream操作還有兩個基本特征:
①Pipelining:中間操作都會傳回流本身;
②内部疊代:以前對集合的周遊都是通過Iterator疊代器進行的,這種叫外部疊代;Stream提供了内部疊代的方式,流可以直接調用周遊方法;
當使用一個流的時候通常包括三個基本步驟:
①擷取資料源(Source);
②資料轉換;
③執行操作擷取想要的結果;
二、擷取Stream流的兩種方式
1、所有的Collection集合都可以通過stream方法擷取流
代碼示範:
//一、把集合轉換為Stream流
//list集合
List<String> list = new ArrayList<>();
Stream<String> s1 = list.stream();
//set集合
Set<String> set = new HashSet<>();
Stream<String> s2 = set.stream();
//map集合
Map<String,String> map = new HashMap<>();
//擷取鍵,存儲到一個set集合中
Set<String> set1 = map.keySet();
Stream<String> s3 = set1.stream();
//擷取值,存儲到一個Collection集合中
Collection<String> collection = map.values();
Stream<String> s4 = collection.stream();
//擷取鍵值對(鍵與值的映射關系 entrySet)
Set<Map.Entry<String, String>> entrySet = map.entrySet();
Stream<Map.Entry<String, String>> s5 = entrySet.stream();
2、Stream接口的靜态方法of可以擷取數組對應的流
代碼示範:
//二、把數組轉換為Stream流
Integer[] arr = {1,2,3,4,5};
Stream<Integer> stream = Stream.of(arr);
String[] strings = {"你好!","Hello!","哈哈哈!"};
Stream<String> stream1 = Stream.of(strings);
三、Stream流的常用方法
1、常用方法分為兩類:
①延遲方法:
傳回值類型仍然是Stream接口自身類型的方法,是以支援鍊式調用(除了終結方法外,其他方法都是延遲方法);
②終結方法:
傳回值類型不再是Stream接口自身的方法,是以不再支援類似StringBuilder那樣的鍊式調用,本小節中終結方法包括count和forEach;
2、forEach周遊
方法:
void forEach(Consumer<? super T> action);
該方法接收一個Consumer接口函數,會将每一個流元素交給該方法處理;
代碼示例:
Stream<String> stream = Stream.of("你好!","Hello!","哈哈!");
stream.forEach(System.out::println);
//你好!
//Hello!
//哈哈!
3、fliter過濾
方法:
Stream<T> fliter(Predicate<? super T> predicate);
作用:
将一個流轉換為一個子集流;
Predicate接口是用于判斷的接口;
代碼實作:
Stream<String> stream = Stream.of("你好!","Hello!","哈哈!");
Stream<String> stream1 = stream.filter((word)->word.startsWith("你"));
stream1.forEach(System.out::println);//你好!
注意:
Stream流隻能使用一次;
代碼說明:
Stream<String> stream = Stream.of("你好!","Hello!","哈哈!");
Stream<String> stream1 = stream.filter((word)->word.startsWith("你"));
stream1.forEach(System.out::println);//你好!
//Stream流是管道流,隻能使用一次
stream1.forEach(System.out::println);//報錯
//java.lang.IllegalStateException: stream has
// already been operated upon or closed
4、map映射
方法:
<R> Stream<R> map(Function<? super T, ? extends R> mapper );
作用:
将流中的元素映射到另一個流中;
Function接口的抽象方法R apply(T t)可以将T類型轉換成R類型,而這種轉換的動作,成為映射;
示範:
Stream<String> stream = Stream.of("1","2","3");
Stream<Integer> stream1 = stream.map(Integer::parseInt);
stream1.forEach(System.out::println);
//1
//2
//3
5、count計數
方法:
long count
作用:
統計個數,相當于集合的size方法;
代碼示範:
Stream<String> stream = Stream.of("1","2","3");
System.out.println(stream.count());//3
6、limit截取前N個元素
方法:
Stream<T> limit(long maxSize);
作用:
截取前N個元素;
代碼實作:
Stream<String> stream = Stream.of("1","2","3");
stream.limit(3).forEach(System.out::println);
//1
//2
//3
7、skip跳過前N個元素
方法:
Stream<T> skip(long n);
作用:
跳過前N個元素;
代碼實作:
Stream<String> stream = Stream.of("1","2","3");
stream.skip(2).forEach(System.out::println);//3
8、concat流的合并
方法:
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
作用:
将兩個流合并成一個流;
代碼實作:
Stream<String> stream1 = Stream.of("1","2","3");
Stream<String> stream2 = Stream.of("4","5","6");
Stream.concat(stream1,stream2).forEach(System.out::println);
//1
//2
//3
//4
//5
//6