我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文教你利用Stream API批量Mock数据的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文教你利用Stream API批量Mock数据的方法

在日常开发的过程中我们经常会遇到需要 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;


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> {

    
    T get();
}

通过代码我们可以看到首先 Supplier 是个接口,既然是接口那就可以进行具体的实现,并且这个接口只有一个方法 get 返回指定的类型,同时该接口还有一个 @FunctionalInterface 注解,表名这个接口是一个函数是编程的接口,函数式接口是指仅仅只包含一个抽象方法的接口。

我们看到这个注解的 javadoc 里面大概的意思是这个注解是用来标识一个函数接口,函数式接口只有一个抽象方法,但是如果有 default 方法或者覆盖了 Object 的 public 方法都不算是抽象方法。还有一句讲的是函数式接口可以通过 lambda 表达式,方法引用或者构造方法引用来创建。我们上面的两个例子演示了 lambda 表达式和方法引用,构造函数其实也一样。

所以总结来说  Stream  的 generate 方法通过接收一个 Supplier  类型的参数来创建一个数据流,得到数据流以后就可以进行各种流的操作了。我们这篇文章更多的是通过 Stream 来构造 mock 数据,创建一个流,对于流的各种操作就不在本文的讨论范围之内了,阿粉之前也有相应的文章介绍过 Stream 感兴趣的小伙伴可以去翻翻看。

总结

工作中 mock 数据在很多场景都会遇到,但是可能很多时候我们都不会太关注 mock 的数据的形式,虽然说一个循环也可以 mock 到相应的数据,但是能写的优雅一点为什么我们不写的优雅一点呢?

以上就是一文教你利用Stream API批量Mock数据的方法的详细内容,更多关于Stream API批量Mock数据的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文教你利用Stream API批量Mock数据的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

4种方法教你利用Python发现数据的规律

发现数据的规律是数据分析和数据科学中非常重要的一个步骤。这篇文章主要给大家整理了4个可以发现数据规律的方法,希望对大家有所帮助
2023-03-19

利用Spring Data MongoDB持久化文档数据的方法教程

前言本文主要给大家介绍了关于利用Spring Data MongoDB持久化文档数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。介绍 NoSQL:not only SQL,非关系型数据 MongoDB是文
2023-05-31

如何批量上传CSV文件数据到MySql表中?使用 LOAD DATA 的一种非常快速的方法

? 简介您还在使用“for”或“while”循环来迭代行并将它们插入数据库吗?您还在编写单独的代码来读取 .csv 文件并将其上传到 mysql 数据库吗?用mysql提供的“load data”语句对线性逻辑说“不”。准备好更改代码以最大
如何批量上传CSV文件数据到MySql表中?使用 LOAD DATA 的一种非常快速的方法
2024-08-19

利用python生成一个导出数据库的bat脚本文件的方法

实例如下:# 环境: python3.xdef getExportDbSql(db, index): # 获取导出一个数据库实例的sql语句sql = 'mysqldump -u%s -p%s -h%s -P%d --default-cha
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录