如何通过Stream API高效批量生成模拟数据?

2026-05-24 01:391阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1580个文字,预计阅读时间需要7分钟。

如何通过Stream API高效批量生成模拟数据?

目录 + Mock + 随机UUID + Mock + 消息 + Supplier + 是什么 + 总结 + 在日常开发过程中,我们经常会遇到需要mock一些数据的场景,例如mock一些接口的返回值或者mock一些测试消息。总结如下:mock接口返回值,mock测试消息用于团队生产。

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

在日常开发的过程中我们经常会遇到需要mock一些数据的场景,比如说mock一些接口的返回或者说mock一些测试消息用于队列生产者发送消息,可能很多时候我们都是使用一些固定的case或者一条相同的数据重复使用。今天阿粉就教大家用Stream去构造一些伪真实的一些数据。

Mock 任意个 UUID

首先我们通过普通写法来构造 100 个UUID,代码如下相信大家都会写,就不多说了。

如何通过Stream API高效批量生成模拟数据?

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

这里我们使用了Streamgenerate方法,该方法接收一个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 是个啥

上文提到Streamgenerate方法接收的是一个Supplier类型的参数,那么这个Supplier是个啥呢?我们来仔细看一下。

package java.util.function; @FunctionalInterface public interface Supplier<T> {     /**      * Gets a result.      *      * @return a result      */     T get(); }

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

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

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

总结

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

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

本文共计1580个文字,预计阅读时间需要7分钟。

如何通过Stream API高效批量生成模拟数据?

目录 + Mock + 随机UUID + Mock + 消息 + Supplier + 是什么 + 总结 + 在日常开发过程中,我们经常会遇到需要mock一些数据的场景,例如mock一些接口的返回值或者mock一些测试消息。总结如下:mock接口返回值,mock测试消息用于团队生产。

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

在日常开发的过程中我们经常会遇到需要mock一些数据的场景,比如说mock一些接口的返回或者说mock一些测试消息用于队列生产者发送消息,可能很多时候我们都是使用一些固定的case或者一条相同的数据重复使用。今天阿粉就教大家用Stream去构造一些伪真实的一些数据。

Mock 任意个 UUID

首先我们通过普通写法来构造 100 个UUID,代码如下相信大家都会写,就不多说了。

如何通过Stream API高效批量生成模拟数据?

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

这里我们使用了Streamgenerate方法,该方法接收一个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 是个啥

上文提到Streamgenerate方法接收的是一个Supplier类型的参数,那么这个Supplier是个啥呢?我们来仔细看一下。

package java.util.function; @FunctionalInterface public interface Supplier<T> {     /**      * Gets a result.      *      * @return a result      */     T get(); }

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

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

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

总结

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

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