如何用Java Stream生成带自增索引、对应不同数量枚举的StorageRoom测试Mock数据
问题核心原因
当前的Stream实现和原循环逻辑存在两处关键偏差:
- 没有绑定每个Size枚举对应的顺序索引,无法计算每个尺寸需要生成的实例数量(原逻辑为:顺序索引i从0开始时,对应尺寸生成i+1个实例)
- 使用1对1的map操作,只能为每个尺寸生成1个实例,无法输出多实例,需要替换为支持1对N输出的flatMap操作做流合并
调整后的可完全对齐原逻辑的实现
import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; import java.util.stream.IntStream; static List<StorageRoom> createStorageRoomsListStream() { AtomicLong idGenerator = new AtomicLong(100L); Size[] allSizes = Size.values(); // 遍历范围和原循环完全一致:从0到枚举总数量-1 return IntStream.range(0, allSizes.length) .flatMap(i -> { Size currentSize = allSizes[i]; // 生成i+1个同尺寸的实例,和原while循环逻辑对齐 return IntStream.rangeClosed(0, i) .mapToObj(seq -> StorageRoom.builder() .id(idGenerator.getAndIncrement()) .size(currentSize) // 显式设置字段值,和原逻辑无偏差 .reserved(false) .build()); }) .collect(Collectors.toList()); }
逻辑对齐校验
- 生成顺序完全匹配原循环:从顺序第0个的
TELEPHONE_BOX开始,依次处理每个尺寸,每个尺寸生成的实例数量严格为索引值+1 - id值从100开始连续自增,和原循环的自增规则一致
- 所有实例的
reserved字段显式赋值为false,无字段遗漏
注意事项
- 不要直接遍历
Size.values()而忽略顺序索引:脱离索引后无法精准匹配每个尺寸对应的生成数量,很容易写出固定生成数量的错误逻辑 - 该场景不要使用并行流:并行流会打乱实例的生成顺序,导致id分配、列表元素顺序和原循环实现不一致,使用默认的顺序流即可完全对齐逻辑
内容的提问来源于stack exchange,提问作者mrKaczorrro
相关产品推荐
相关产品推荐

