這篇文章從我的csdn復制過來,格式有點難看,可以直接去csdn看
目錄
一、stream流的分類
二、stream流的用法
1、準備工作
2.流的構造
3.方法測試 (測試方法的用法)
1.filter方法
2.map
3.flatMap
4.distinct()
5.sorted()
6.peek()
7.limit()
8.skip()
9.foreach()
10.forEachOrdered()
11.toArray()
12.reduce()
13.collect()
14.anyMatch()、allMatch()、noneMatch()
15.findFirst()、findAny()
16.stream流的一些操作(待考證)
三、Optional類
分為串行流和並行流。
使用parallelStream方法可以得到一個並行流,並行流底層使用的是forkjoin框架,對於一些計算量比較大的任務,使用並行流可能極大的提升效率。但是使用並行流必須保證每個元素都獨立不受影響。每一個元素的功能(function)在做什麼及它是否適合運行在並行代碼中。當方法是調用一些同步方法,並行流可能會在同步方法上等待,進而導致並行流的性能並沒有想象中高。(所以要有選擇的使用)。
串行流就是按照順序執行的,平常最多使用的就是這個。
其中Stream有一個源,0個或者多個中間操作,以及一個終止操作。Stream隻有遇到終止操作,它的源才開始執行遍歷操作,而且隻會進行一次遍歷,而不是每個操作都執行一次遍歷。
java中的Stream帶有lazy執行特征,在整個操作過程中, 隻有遇到terminate操作函數,才會觸發stream的整體運算。即,如果沒有terminate動作,中間不論做什麼, 都不會執行。map和peek都屬於中間操作,隻有執行完終止操作才會對原來的對象進行改變。
常見的操作可以歸類如下:
借鑒stream的分類(上圖借鑒的連接,支持原創)
其中limit是一個 short-circuiting stateful intermediate operation (也是一個短路操作)。
這樣理解中間操作和終止操作。一個中間操作或者多個中間操作,其返回的結果對象還是一個stream流,但是一旦使用瞭終止操作,那麼返回的就不在是一個stream流,就會返回對應的終止操作的對象。其中屬於終止操作的短路操作也是會返回對應的對象,而不是一個流。
(1)實體類 Admin
/** * <p> * 管理員信息表 * </p> * * @author zwh * @since 2021-09-01 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("lib_admin") public class Admin implements Serializable { /** * 管理員id */ @TableId(type = IdType.AUTO) private Long id; /** * 姓名 */ private String name; /** * 密碼 */ private String password; /** * 加密鹽 */ private String salt; /** * 創建時間 */ private LocalDateTime createTime; /** * 更新時間 */ private LocalDateTime updateTime; /** * 是否刪除 0 否 false ,1 是 true */ private Boolean isDeleted; }
(2)數據庫測試的數據
b0cd4a02f35d02c7cae86b9107a8dc88
以上面的數據為基準去測試對應的stream的方法。
一般有三個方法。
1.直接賦值
2.數組構造
3.集合構造
// 1. Individual values Stream stream = Stream.of("a", "b", "c");
// 2. Arrays String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray); stream = Arrays.stream(strArray);
// 3. Collections List<String> list = Arrays.asList(strArray); stream = list.stream();
(List<Admin> adminList = this.baseMapper.selectList(null)):默認的adminList為全查表數據
通過stream借助lamda表達式對集合collection進行操作(篩選、排序、聚合等),這裡采用集合的方法去構造stream流
filter方法是過濾方法,是留下符合條件的數據,形成一個新的stream流。
查出所有被刪除的人。
@Override
public List<Admin> init() {
/* 學習stream流的用法 */
List<Admin> adminList = this.baseMapper.selectList(null);
List<Admin> list = adminList.stream().filter(Admin::getIsDeleted).collect(Collectors.toList());
return list ;
//return this.baseMapper.selectList(Wrappers.<Admin>lambdaQuery().eq(Admin::getIsDeleted,true));
}
上面可以看出filter的用法是留下符合filter(),括號裡面的條件的數據,這裡就是符合isdeletde = true ;把符合條件的保存下來,不符合條件的直接過濾。
當然也可以直接用一條sql查詢,但是這裡是測試filter的用法。
當然filter是一個中間操作,可以繼續連接中間操作,知道遇到一個終止操作,這個stream流就停止瞭。
d747f746646a9c8135a6e43795751365
Returns a stream consisting of the results of applying the given function to the elements of this stream.
(報告出品方/作者:興業證券,宋婧茹、陳雅雯)1. 源自普羅旺斯的天然個護品牌集團LOCCITANE 是一間以天然和有機成分生產化...