欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文教你利用Stream?API批量Mock數(shù)據(jù)的方法

 更新時間:2022年09月05日 08:41:56   作者:鴨血粉絲Tang  
在日常開發(fā)的過程中我們經(jīng)常會遇到需要mock一些數(shù)據(jù)的場景,比如說?mock?一些接口的返回或者說?mock?一些測試消息用于隊列生產(chǎn)者發(fā)送消息。本文將教你如何通過?Stream?API?批量?Mock?數(shù)據(jù),需要的可以參考一下

在日常開發(fā)的過程中我們經(jīng)常會遇到需要 mock 一些數(shù)據(jù)的場景,比如說 mock 一些接口的返回或者說 mock 一些測試消息用于隊列生產(chǎn)者發(fā)送消息,可能很多時候我們都是使用一些固定的 case 或者一條相同的數(shù)據(jù)重復使用。今天阿粉就教大家用 Stream 去構造一些偽真實的一些數(shù)據(jù)。

Mock 任意個 UUID

首先我們通過普通寫法來構造 100 個 UUID,代碼如下相信大家都會寫,就不多說了。

??public?static?List<UUID>?listUUID(int?size)?{
????List<UUID>?list?=?new?ArrayList<>();
????for?(int?i?=?0;?i?<?size;?i++)?{
??????UUID?uuid?=?UUID.randomUUID();
??????list.add(uuid);
????}
????return?list;
??}

下面再提供 Stream 的寫法,代碼如下,一行搞定

??public?static?List<UUID>?listUUID2(int?size)?{
????return?Stream.generate(UUID::randomUUID).limit(size).collect(Collectors.toList());
??}

這里我們使用了 Stream 的 generate 方法,該方法接收一個 Supplier 類型的參數(shù),Supplier 是一個功能接口,只有一個 get 方法,返回一個對象,不接收任何參數(shù),上面我們就是通過 UUID 靜態(tài)引用的方式獲得一個 UUID 對象,另外我們使用 limit 方法來進行截斷只獲取 100 個。

Mock 消息

接下來我們再使用 Stream API 批量構造一批消息,作為隊列的生產(chǎn)者進行數(shù)據(jù)發(fā)送

定義消息體

package?com.example.demo.dto;

/**
?*?<br>
?*?<b>Function:</b><br>
?*?<b>Author:</b>@author?Java?極客技術<br>
?*?<b>Date:</b>2022-09-03 11:49<br>
?*?<b>Desc:</b>無<br>
?*/
public?class?Message?{
??int?id;
??String?message;

??public?Message(int?id,?String?message)?{
????this.id?=?id;
????this.message?=?message;
??}

??@Override
??public?String?toString()?{
????return?"Message{"?+
??????"id="?+?id?+
??????",?message='"?+?message?+?'\''?+
??????'}';
??}
}

測試代碼

??public?static?void?main(String[]?args)?{
????List<Message>?messages?=?genMessage(10);
????messages.forEach(System.out::println);
??}

??public?static?List<Message>?genMessage(int?size)?{
????AtomicInteger?atomicInteger?=?new?AtomicInteger();
????Supplier<Message>?supplier?=?()?->?{
??????Message?message?=?new?Message(new?Random().nextInt(),?"Message?:?"?+?atomicInteger.getAndIncrement());
??????System.out.println("inner:"?+?message.toString());
??????return?message;
????};
????System.out.println(99);
????return?Stream.generate(supplier).limit(size).collect(Collectors.toList());
??}

先看下運行結果,我們再來分析,可以看到第一個 case 我們是使用靜態(tài)引用來返回一個 UUID 對象,這個 case 我們通過創(chuàng)建 lambda 表達式的形式來實現(xiàn)一個 Supplier,在表達式中我們進行 message 對象的構造,然后進行返回。其實上文的靜態(tài)引用,本質(zhì)上也是一個 lambda,所以跟下面的實現(xiàn)是一個原理,只不過是一些語法糖而已。

??public?static?List<UUID>?listUUID2(int?size)?{
????Supplier<UUID>?supplier?=?()?->?UUID.randomUUID();
????return?Stream.generate(supplier).limit(size).collect(Collectors.toList());
??}

如果對 Stream 流有理解的可以看到,我們這里有兩個點需要注意,一個是我們這里的輸出 99 是在 inner 之前的,另一個是我們這里使用的 limit 方法,不然會一直進行輸出不會停止的,這兩點其實都是流的基本特性,就不多說了。

Supplier 是個啥

上文提到 Stream  的 generate 方法接收的是一個 Supplier 類型的參數(shù),那么這個 Supplier  是個啥呢?我們來仔細看一下。

package?java.util.function;

@FunctionalInterface
public?interface?Supplier<T>?{

????/**
?????*?Gets?a?result.
?????*
?????*?@return?a?result
?????*/
????T?get();
}

通過代碼我們可以看到首先 Supplier 是個接口,既然是接口那就可以進行具體的實現(xiàn),并且這個接口只有一個方法 get 返回指定的類型,同時該接口還有一個 @FunctionalInterface 注解,表名這個接口是一個函數(shù)是編程的接口,函數(shù)式接口是指僅僅只包含一個抽象方法的接口。

我們看到這個注解的 javadoc 里面大概的意思是這個注解是用來標識一個函數(shù)接口,函數(shù)式接口只有一個抽象方法,但是如果有 default 方法或者覆蓋了 Object 的 public 方法都不算是抽象方法。還有一句講的是函數(shù)式接口可以通過 lambda 表達式,方法引用或者構造方法引用來創(chuàng)建。我們上面的兩個例子演示了 lambda 表達式和方法引用,構造函數(shù)其實也一樣。

所以總結來說  Stream  的 generate 方法通過接收一個 Supplier  類型的參數(shù)來創(chuàng)建一個數(shù)據(jù)流,得到數(shù)據(jù)流以后就可以進行各種流的操作了。我們這篇文章更多的是通過 Stream 來構造 mock 數(shù)據(jù),創(chuàng)建一個流,對于流的各種操作就不在本文的討論范圍之內(nèi)了,阿粉之前也有相應的文章介紹過 Stream 感興趣的小伙伴可以去翻翻看。

總結

工作中 mock 數(shù)據(jù)在很多場景都會遇到,但是可能很多時候我們都不會太關注 mock 的數(shù)據(jù)的形式,雖然說一個循環(huán)也可以 mock 到相應的數(shù)據(jù),但是能寫的優(yōu)雅一點為什么我們不寫的優(yōu)雅一點呢?

以上就是一文教你利用Stream API批量Mock數(shù)據(jù)的方法的詳細內(nèi)容,更多關于Stream API批量Mock數(shù)據(jù)的資料請關注腳本之家其它相關文章!

相關文章

  • Mybatis-Plus 條件構造器 QueryWrapper 的基本用法

    Mybatis-Plus 條件構造器 QueryWrapper 的基本用法

    這篇文章主要介紹了Mybatis-Plus - 條件構造器 QueryWrapper 的使用,通過實例代碼給大家介紹了查詢示例代碼及實現(xiàn)需求,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • java正則表達式獲取指定HTML標簽的指定屬性值且替換的方法

    java正則表達式獲取指定HTML標簽的指定屬性值且替換的方法

    下面小編就為大家?guī)硪黄猨ava正則表達式獲取指定HTML標簽的指定屬性值且替換的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • spring data jpa開啟批量插入、批量更新的問題解析

    spring data jpa開啟批量插入、批量更新的問題解析

    這篇文章主要介紹了spring data jpa開啟批量插入、批量更新問題,本文通過圖文實例相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • Springboot之修改啟動端口的兩種方式(小結)

    Springboot之修改啟動端口的兩種方式(小結)

    這篇文章主要介紹了Springboot之修改啟動端口的兩種方式(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java實現(xiàn)圖形界面計算器

    Java實現(xiàn)圖形界面計算器

    這篇文章主要為大家詳細介紹了Java實現(xiàn)圖形界面計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 使用Java通過OAuth協(xié)議驗證發(fā)送微博的教程

    使用Java通過OAuth協(xié)議驗證發(fā)送微博的教程

    這篇文章主要介紹了使用Java通過OAuth協(xié)議驗證發(fā)送微博的教程,使用到了新浪微博為Java開放的API weibo4j,需要的朋友可以參考下
    2016-02-02
  • spring-shiro權限控制realm實戰(zhàn)教程

    spring-shiro權限控制realm實戰(zhàn)教程

    這篇文章主要介紹了spring-shiro權限控制realm實戰(zhàn)教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • YGC前后新生代是否變大分析詳解

    YGC前后新生代是否變大分析詳解

    要解釋這個問題,我們先要弄清楚YGC的過程,parNew是新生代的gc算法,簡單來說從gc roots開始掃描對象,當掃到一個只要是屬于新生代的對象就將其挪到to space,但是老的對象還不會做釋放,直到gc完成之后再看是否釋放老的對象
    2022-01-01
  • Java對象的四種引用方式實例分析

    Java對象的四種引用方式實例分析

    這篇文章主要介紹了Java對象的四種引用方式,簡單描述了四種引用方式的概念、應用場景并結合實例形式分析了弱引用所引用對象的垃圾回收過程,需要的朋友可以參考下
    2019-08-08
  • Java基于TCP協(xié)議socket網(wǎng)絡編程的文件傳送的實現(xiàn)

    Java基于TCP協(xié)議socket網(wǎng)絡編程的文件傳送的實現(xiàn)

    這篇文章主要介紹了Java基于TCP協(xié)議socket網(wǎng)絡編程的文件傳送的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論