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

目录
  • Mock 任意个 UUID
  • Mock 消息
  • Supplier 是个啥
  • 总结

在日常开发的过程中我们经常会遇到需要 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 到相应的数据,但是能写的优雅一点为什么我们不写的优雅一点呢?

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

(0)

相关推荐

  • Java8新特性之Stream API详解

    一.前言 StreamAPI在Java8版本中使用,关注的是对数据的筛选.查找.存储等 它可以做的事情有:过滤.排序.映射.归约 二.使用流程 Stream实例化中间操作(过滤.排序.映射.规约)终止操作(匹配查找.归约.收集) 三.案例演示 public class EmployeeData { public static List<Employee> getEmployees(){ List<Employee> list = new ArrayList<>(); l

  • 一文带你掌握Java8强大的StreamAPI

    目录 Stream 概述 Stream 实例化 1.方式一:通过集合 2.方式二:通过数组 3.方式三:通过Stream的of() 4.方式四:创建无限流 Stream 中间操作 1.筛选与切片 2.映射 3.排序 Stream 终止操作 1.匹配与查找 2.归约 3.收集 Stream 概述 Stream API ( java.util.stream) 把真正的函数式编程风格引入到Java中.这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力,让程

  • 基于Java8 Stream API实现数据抽取收集

    目标&背景 我们以"处理订单数据"为例,假设我们的应用是一个分布式应用,有"订单应用","物流应用","商品应用"等都是独立的服务.本次我们的目的需要展示订单列表完整数据: 1.查询订单列表. 2.批量查询物流信息. 3.将物流信息填充到订单主信息中. 假设我们定义了一个订单类,具有几个关键的属性:订单号,状态,订单价,快递信息.如下所示: class Order{ String orderSeq; String st

  • java8使用Stream API方法总结

    Stream是java8中处理集合的关键抽象概念,它可以指定您希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询. Stream 的三个操作步骤 1.创建Stream. 得到Stream流的第一种方式: 可以通过Collection系列集合提供提供的Stream()或parallelStream @Test public void test1() { //可以通过Collection系列集合提供提供的

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

    目录 Mock 任意个 UUID Mock 消息 Supplier 是个啥 总结 在日常开发的过程中我们经常会遇到需要 mock 一些数据的场景,比如说 mock 一些接口的返回或者说 mock 一些测试消息用于队列生产者发送消息,可能很多时候我们都是使用一些固定的 case 或者一条相同的数据重复使用.今天阿粉就教大家用 Stream 去构造一些伪真实的一些数据. Mock 任意个 UUID 首先我们通过普通写法来构造 100 个 UUID,代码如下相信大家都会写,就不多说了.   publi

  • Django框架利用ajax实现批量导入数据功能

    本文实例为大家分享了网页中利用ajax实现批量导入数据功能的实现方法,供大家参考,具体内容如下 url.py代码: 复制代码 代码如下: url(r'^workimport/$', 'keywork.views.import_keywork', name='import_keywork') view.py代码: from keywork.models import DevData from django.http import JsonResponse #django ajax部分 def im

  • C#实现利用Windows API读写INI文件的方法

    本文实例讲述了C#实现利用Windows API读写INI文件的方法.分享给大家供大家参考.具体如下: 写入时,如果没有INI文件,自动创建INI 如果在创建时,GetLastError:5 检查IniPath是否添加了文件名称.ini using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace

  • 利用MySqlBulkLoader实现批量插入数据的示例详解

    目录 介绍 1.将List转化为DataTable 2.将DataTable转换为标准的CSV文件 3.CSV文件导入数据到数据库 4.使用MySqlBulkLoader批量插入数据 5.完整的代码 介绍 最近在项目中遇到插入数据瓶颈,几万.几十万.几百万的数据保存到MYSQL数据库,使用EF插入数据速度非常慢,数据量非常大时EF插入需要几十分钟,甚至几个小时,这样子的速度肯定不是我们所期望的. 后面经过了解与研究发现MySqlBulkLoader,可以批量将数据插入到数据库并且速度上面远远优于

  • vue-cli项目使用mock数据的方法(借助express)

    前言 现如今前后端分离开发越来越普遍,前端人员写好页面后可以自己模拟一些数据进行代码测试,这样就不必等后端接口,提高了我们开发效率.今天就来分析下前端常用的mock数据的方式是如何实现的. 主体 项目是基于vue-cli的,首先必须搭建好vue项目环境.如果有同学不知道如何搭建vue项目,可以参考我的另外一篇文章.因为mock数据需要借助node.js中express框架,所以必须先在项目中安装npm install express --save. 搭建完基础后,我们在src文件下创建一个moc

  • vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法

    由于最新版本的vue-cli已经放弃dev-server.js,需在webpack.dev.conf.js配置才行 新版本的webpack.dev.conf.js配置如下: const express require('express') const app =express() var appData = require('..data.json') var seller = appData.seller var goods = appData.goods var ratings = appD

  • vue-cli3使用mock数据的方法分析

    本文实例讲述了vue-cli3使用mock数据的方法.分享给大家供大家参考,具体如下: 在前后端分离的开发模式中,后端给前端提供一个接口,由前端向后端发请求,得到数据后前端进行渲染.由于前后端开发进度的不统一,前端往往使用本地的测试数据进行数据渲染的测试. 正文开始 在vue-cli构建的项目,我们可以借助devServer开启一个服务,然后我们可以通过路由模拟一个接口来进行测试. 在vue-cli2和vue-cli3中的配置方式是不同的.下面分别展示 ## vue-cli2 先放一张vue-c

  • Thinkphp批量更新数据的方法汇总

    以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步! 方法一: //批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式 function batch_update($table_name='',$data=array(),$field=''){ if(!$table_name||!$data||!$field){ return false; }else{ $sql='UPDATE '.$table_name

  • YII框架批量插入数据的方法

    本文实例讲述了YII框架批量插入数据的方法.分享给大家供大家参考,具体如下: public function insertSeveral($table, $array_columns) { $sql = ''; $params = array(); $i = 0; foreach ($array_columns as $columns) { $names = array(); $placeholders = array(); foreach ($columns as $name => $valu

  • sql下三种批量插入数据的方法

    本文将介绍三种批量插入数据的方法.第一种方法是使用循环语句逐个将数据项插入到数据库中:第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表:第三种使用的方法是sql server中的表值参数方法,表值参数是 SQL Server 2008 中的新参数类型.表值参数是使用用户定义的表类型来声明的.使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据. 代码示例: 此例子为控制台输出

随机推荐