无需转换为列表,从PreparedStatement.executeBatch返回的int数组中筛选值大于0的元素索引的方法咨询
无需列表转换,直接筛选批量更新有效索引的方案
当然有不用把原数组转成列表的实现方式啦,而且直接操作原数组的效率还更高,给你两种实用的方案:
方案1:用IntStream直接操作原数组(最简洁)
你之前的流式思路完全可以直接适配原数组,根本不需要转列表——只需要把列表的size()换成数组的length,然后通过数组下标直接访问元素就行:
int[] updateResultArray = preparedStatement.executeBatch(); // 直接基于原数组生成索引流,过滤出元素>0的索引 int[] validIndexes = IntStream.range(0, updateResultArray.length) .filter(i -> updateResultArray[i] > 0) .toArray();
拿你的示例数组[0,2,1,0,0,1,2]测试,这段代码会直接返回[1,2,5,6],完美符合你的需求。
方案2:传统for循环实现(适合偏好非流式API的场景)
如果你不太习惯用流式API,也可以用普通循环手动收集符合条件的索引,同样不需要转换原数组:
int[] updateResultArray = preparedStatement.executeBatch(); List<Integer> validIndexList = new ArrayList<>(); for (int i = 0; i < updateResultArray.length; i++) { if (updateResultArray[i] > 0) { validIndexList.add(i); } } // 如果需要转换成int数组,再执行这一步 int[] validIndexes = validIndexList.stream().mapToInt(Integer::intValue).toArray();
这里只是用列表临时存结果,原数组全程没被转换,最后按需转成int数组就行。
小补充
其实你之前的代码逻辑没问题,只是多了“转列表”的冗余步骤——IntStream.range只需要知道元素的数量(数组长度)就能生成索引流,直接通过下标访问原数组元素就完成过滤了,完全没必要绕到列表那一步~
内容的提问来源于stack exchange,提问作者kaviya .P
相关产品推荐
相关产品推荐

