当前位置: 首页 > 科技观察

本文教大家如何通过StreamAPI批量Mock数据

时间:2023-03-18 11:32:22 科技观察

在日常开发过程中,我们经常会遇到需要mock一些数据的场景,比如mock一些接口返回或者mock一些队列的测试消息生产者发送消息,很多时候我们可能会用到一些固定的case,或者复用同一条数据。今天阿粉就教大家用Stream构造一些伪真实的数据。模拟任意数量的UUID首先,我们通过普通的写法构造了100个UUID。代码如下,相信大家都能写出来,就不多说了。publicstaticListlistUUID(intsize){Listlist=newArrayList<>();for(inti=0;ilistUUID2(intsize){returnStream.generate(UUID::randomUUID).limit(size).收集(收集器。toList());}这里我们使用Streamgenerate方法,它接收一个Supplier类型的参数,Supplier是一个函数式接口,只有一个get方法,返回一个对象,不接收任何参数,上面我们通过UUID获取了一个UUID对象静态引用,我们用limit方法截断,只得到100。模拟消息接下来,我们将使用StreamAPI批量构造一批消息,并作为队列生产者发送数据。定义消息体包com.example.demo.dto;/***
*功能:
*作者:@authorJava极客技术
*日期:2022-09-0311:49
*描述:
*/publicclassMessage{intid;字符串消息;publicMessage(intid,Stringmessage){this.id=id;this.message=消息;}@OverridepublicStringtoString(){return"Message{"+"id="+id+",message='"+message+'\''+'}';}}测试代码publicstaticvoidmain(String[]args){Listmessages=genMessage(10);messages.forEach(System.out::println);}publicstaticListgenMessage(intsize){AtomicIntegeratomicInteger=newAtomicInteger();Supplier供应商=()->{Messagemessage=newMessage(newRandom().nextInt(),"Message:"+atomicInteger.getAndIncreme新台币());System.out.println("内部:"+message.toString());回复信息;};System.out.println(99);返回Stream.generate(supplier).limit(size)。收集(收集器。toList());先看运行结果,再分析。我们可以看到,在第一种情况下,我们使用静态引用返回一个UUID对象。在本例中,我们创建了一个lambda表达式,在该表达式中,我们构造了消息对象,然后将其返回。其实上面的静态引用本质上也是一个lambda,所以和下面的实现原理是一样的,只不过是一些语法Sugar而已。publicstaticListlistUUID2(intsize){Suppliersupplier=()->UUID.randomUUID();返回Stream.generate(supplier).limit(size).collect(Collectors.toList());}如果对Stream流有所了解的话,可以看出这里有两点我们需要注意。一是这里的输出99在inner之前,二是我们这里使用的limit方法,否则会继续输出,不会停止。这两点其实就是流的基本特性,就不多说了。什么是供应商?上面说到Stream的generate方法接收一个Supplier类型的参数,那么这个Supplier是什么?让我们仔细看看。packagejava.util.function;@FunctionalInterfacepublicinterfaceSupplier{/***获取结果。**@returnaresult*/Tget();}通过代码我们可以看出Supplier首先是一个接口,既然是接口就可以具体实现,而这个接口只有一个方法get返回指定的类型。同时接口还有一个@FunctionalInterface注解。表名的接口是一个函数和编程接口。函数式接口是指只包含一个抽象方法的接口。我们看到这个注解的javadoc大概意思就是这个注解是用来标识一个函数式接口的。一个函数式接口只有一个抽象方法,但如果有默认方法或者覆盖了Object的公共方法,则不认为是抽象的。方法。换句话说,可以通过lambda表达式、方法引用或构造函数引用来创建函数式接口。我们上面的两个例子演示了lambda表达式和方法引用,构造函数也是如此。所以综上所述,Stream的generate方法通过接收一个Supplier类型的参数来创建一个数据流,拿到数据流之后,就可以进行各种流操作了。在本文中,我们使用Stream构造模拟数据并创建流。对流的各种操作超出了本文的范围。阿粉也有相应的文章,介绍了Stream感兴趣的东西,小伙伴们可以去看看。小结在工作中,很多场景都会遇到mock数据,但是很多时候我们可能并没有太在意mock数据的形式。虽然一个循环也可以mock到相应的数据,但是可以写的更优雅一些。为什么我们不把它写得更优雅一点呢?