日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

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 類型的參數,Supplier 是一個功能接口,只有一個 get 方法,返回一個對象,不接收任何參數,上面我們就是通過 UUID 靜態引用的方式獲得一個 UUID 對象,另外我們使用 limit 方法來進行截斷只獲取 100 個。

Mock 消息

接下來我們再使用 Stream API 批量構造一批消息,作為隊列的生產者進行數據發送

定義消息體

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 我們是使用靜態引用來返回一個 UUID 對象,這個 case 我們通過創建 lambda 表達式的形式來實現一個 Supplier,在表達式中我們進行 message 對象的構造,然后進行返回。其實上文的靜態引用,本質上也是一個 lambda,所以跟下面的實現是一個原理,只不過是一些語法糖而已。

  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 類型的參數,那么這個 Supplier 是個啥呢?我們來仔細看一下。

package java.util.function;

@FunctionalInterface
public interface Supplier<T> {

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

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

 

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

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

總結

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

原文鏈接:
https://mp.weixin.qq.com/s/Pc3aeVw6W2m4kQA6E7uPKA

分享到:
標簽:Stream API
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定