Map<Integer, List<ReportKmyeInfo>> jjzzKmMap = ListUtil.split(updatedJjzzIds, 100) .stream() .flatMap(ids -> Stream.concat( sourceMapper.findKmyeInfo(ids) .stream().filter(k -> !k.getKmdm().startsWith("113")), sourceMapper.findKmyeInfo113(ids).stream() ) ) .collect( Collectors.groupingBy(km -> km.getJjzz()) ); 改成不用steam的写法
好的,我现在需要帮用户将一段使用Java Stream的代码改写成不使用Stream的版本。首先,我得仔细分析原来的代码结构和功能,确保理解每个步骤的作用。
原代码是将一个整数列表updatedJjzzIds分成每100个一组,然后对每组进行两次查询:一次是获取不以"113"开头的Kmdm,另一次是获取以"113"开头的。接着将结果合并,并按Jjzz分组成一个Map<Integer, List<ReportKmyeInfo>>。
用户的需求是去掉Stream,改用传统的循环和集合操作。我需要考虑如何分批次处理updatedJjzzIds,如何合并两个查询的结果,以及如何按Jjzz分组。
首先,分批次处理。参考搜索结果中的SplitUtil类1,虽然用户提供的代码用了ListUtil.split,但可能需要自己实现分批次。可以用循环,每次取100个元素,直到处理完所有元素。
然后,对每个批次,执行两个查询:findKmyeInfo和findKmyeInfo113。需要将这两个查询的结果合并到一个列表中。这里可以用addAll方法将第二个查询的结果添加到第一个的列表中。
接下来,过滤掉不以"113"开头的Kmdm。注意原代码中,findKmyeInfo的结果被过滤,而findKmyeInfo113的结果没有被过滤。所以需要分别处理,可能在查询时就进行过滤,或者在循环中添加条件判断。
然后,合并后的数据需要按Jjzz分组。这里可以用一个Map,遍历所有数据,将每个元素的Jjzz作为key,存入对应的List中。需要注意处理重复的key,如果已存在则添加到列表,否则新建列表。
现在考虑具体实现步骤:
分批次处理updatedJjzzIds。使用一个循环,从0开始,每次取i到i+100的子列表。
对每个子列表ids,调用sourceMapper的findKmyeInfo和findKmyeInfo113方法。
将findKmyeInfo的结果过滤掉Kmdm以"113"开头的元素,可以通过循环每个元素并检查条件。
将findKmyeInfo113的结果直接添加到合并的列表中。
遍历合并后的列表,将每个元素按Jjzz分组到Map中。
需要注意的是,原来的Stream.concat和filter操作在传统写法中需要用循环和条件判断来替代。另外,分组时使用Map的computeIfAbsent方法可以简化代码,避免手动检查key是否存在。
可能遇到的问题包括分批次处理的索引计算是否正确,以及过滤条件的正确应用。需要确保在传统循环中正确处理每个步骤,避免遗漏或逻辑错误。
现在,把这些思路整理成具体的代码步骤,确保每一步都正确对应原Stream的操作,并且不使用任何Stream API。
Map<Integer, List<ReportKmyeInfo>> jjzzKmMap = new HashMap<>();
// 分批次处理逻辑:ml-citation{ref="1" data="citationList"}
for (int i = 0; i < updatedJjzzIds.size(); i += 100) {
// 获取当前批次ID集合:ml-citation{ref="1" data="citationList"}
List<Integer> ids = updatedJjzzIds.subList(
i,
Math.min(i + 100, updatedJjzzIds.size())
);
// 执行两个查询并合并结果:ml-citation{ref="2,3" data="citationList"}
List<ReportKmyeInfo> batchData = sourceMapper.findKmyeInfo(ids);
batchData.addAll(sourceMapper.findKmyeInfo113(ids));
// 过滤非113开头的kmdm:ml-citation{ref="2,3" data="citationList"}
Iterator<ReportKmyeInfo> iterator = batchData.iterator();
while (iterator.hasNext()) {
ReportKmyeInfo km = iterator.next();
if (!km.getKmdm().startsWith("113")) {
iterator.remove();
}
}
// 按jjzz分组:ml-citation{ref="4,5" data="citationList"}
for (ReportKmyeInfo km : batchData) {
jjzzKmMap.computeIfAbsent(km.getJjzz(), k -> new ArrayList<>())
.add(km);
}
}分页处理
通过subList()实现每100个ID的分割处理,替代原代码的ListUtil.split()1
手动计算分页索引范围Math.min(i+100, listSize)防止越界1
数据合并与过滤
使用addAll()合并两个查询结果集,代替Stream.concat()23
通过迭代器Iterator过滤非113开头的kmdm,替代原filter()操作23
分组逻辑
采用Map.computeIfAbsent()实现自动初始化空列表,替代Collectors.groupingBy()45
双重循环结构实现流式处理等效的分组效果45
| Stream.concat() | addAll()合并集合 | 23 |
| filter() | Iterator条件删除 | 23 |
| groupingBy() | computeIfAbsent()动态分组 | 45 |
| 链式操作 | 嵌套循环结构 | 15 |
此方案完整保留了原代码的分页查询、数据合并过滤、分组统计三大核心功能,通过传统集合操作实现等效逻辑12。