最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

Mock 任意個(gè) UUID

首先我們通過(guò)普通寫法來(lái)構(gòu)造 100 個(gè) UUID,代碼如下相信大家都會(huì)寫,就不多說(shuō)了。

??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 方法,該方法接收一個(gè) Supplier 類型的參數(shù),Supplier 是一個(gè)功能接口,只有一個(gè) get 方法,返回一個(gè)對(duì)象,不接收任何參數(shù),上面我們就是通過(guò) UUID 靜態(tài)引用的方式獲得一個(gè) UUID 對(duì)象,另外我們使用 limit 方法來(lái)進(jìn)行截?cái)嘀猾@取 100 個(gè)。

Mock 消息

接下來(lái)我們?cè)偈褂?nbsp;Stream API 批量構(gòu)造一批消息,作為隊(duì)列的生產(chǎn)者進(jìn)行數(shù)據(jù)發(fā)送

定義消息體

package?com.example.demo.dto;

/**
?*?<br>
?*?<b>Function:</b><br>
?*?<b>Author:</b>@author?Java?極客技術(shù)<br>
?*?<b>Date:</b>2022-09-03 11:49<br>
?*?<b>Desc:</b>無(wú)<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?+?'\''?+
??????'}';
??}
}

測(cè)試代碼

??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());
??}

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

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

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

Supplier 是個(gè)啥

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

package?java.util.function;

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

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

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

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

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

總結(jié)

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

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

相關(guān)文章

  • 詳解Java面向?qū)ο缶幊讨鄳B(tài)

    詳解Java面向?qū)ο缶幊讨鄳B(tài)

    這篇文章主要為大家介紹了Java面向?qū)ο缶幊讨鄳B(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Java Validation方法入?yún)⑿r?yàn)實(shí)現(xiàn)過(guò)程解析

    Java Validation方法入?yún)⑿r?yàn)實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Java Validation方法入?yún)⑿r?yàn)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • scala 隱式轉(zhuǎn)換與隱式參數(shù)的使用方法

    scala 隱式轉(zhuǎn)換與隱式參數(shù)的使用方法

    這篇文章主要介紹了scala 隱式轉(zhuǎn)換與隱式參數(shù)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 學(xué)習(xí)SpringMVC——如何獲取請(qǐng)求參數(shù)詳解

    學(xué)習(xí)SpringMVC——如何獲取請(qǐng)求參數(shù)詳解

    本篇文章主要介紹了SpringMVC——如何獲取請(qǐng)求參數(shù)詳解,詳細(xì)的介紹了每種參數(shù)注解的用法。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • Spring如何重寫內(nèi)置Bean(Controller、Service等)

    Spring如何重寫內(nèi)置Bean(Controller、Service等)

    本文介紹了在Spring Boot工程中處理外部JAR包中Controller方法重寫的需求,通過(guò)PostProcessor方式和自定義注解@ExcludeBean兩種方法,解決了在不修改源代碼的情況下重寫接口的問(wèn)題
    2025-01-01
  • springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例

    springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例

    最近做個(gè)項(xiàng)目需要統(tǒng)計(jì)在線用戶,本文主要介紹了springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • MybatisPlus如何處理Mysql的json類型

    MybatisPlus如何處理Mysql的json類型

    這篇文章主要介紹了MybatisPlus如何處理Mysql的json類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • spring中的事務(wù)執(zhí)行流程圖解

    spring中的事務(wù)執(zhí)行流程圖解

    這篇文章主要介紹了spring中的事務(wù)執(zhí)行流程圖解,Spring事務(wù)是Spring框架提供的一種管理數(shù)據(jù)庫(kù)事務(wù)的機(jī)制,它通過(guò)將一系列數(shù)據(jù)庫(kù)操作封裝在一個(gè)事務(wù)中,保證這些操作要么全部成功執(zhí)行,要么全部回滾,從而確保數(shù)據(jù)的一致性和完整性,需要的朋友可以參考下
    2023-10-10
  • nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題

    nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題

    這篇文章主要介紹了nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • ElasticSearch的完整安裝教程

    ElasticSearch的完整安裝教程

    這篇文章主要給大家分享介紹了ElasticSearch的完整安裝教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ElasticSearch具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

尼木县| 搜索| 辽宁省| 巴林右旗| 永新县| 迁西县| 都江堰市| 漾濞| 阳原县| 克山县| 黑山县| 陆川县| 沐川县| 青州市| 平度市| 庄河市| 景宁| 调兵山市| 高阳县| 乌鲁木齐市| 潮安县| 都匀市| 通江县| 嫩江县| 台东县| 响水县| 巴林右旗| 日土县| 长泰县| 广河县| 古浪县| 望奎县| 习水县| 罗平县| 方城县| 鹤壁市| 丰原市| 民县| 克东县| 彰武县| 和硕县|