
本文介绍如何使用 java 8 stream api(特别是 intstream.range + boxed())准确、安全地获取集合中满足特定条件(如非空字符串)的所有元素索引,并避免常见类型转换异常。
本文介绍如何使用 java 8 stream api(特别是 intstream.range + boxed())准确、安全地获取集合中满足特定条件(如非空字符串)的所有元素索引,并避免常见类型转换异常。
在 Java 开发中,经常需要从 List
✅ 正确做法是:利用 boxed() 将 IntStream 转换为 Stream
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
// 示例数据
List<String> row = Arrays.asList("", "apple", null, "banana", "");
// ✅ 安全获取所有非空(且非 null)字符串的索引
Set<Integer> columnNum = IntStream.range(0, row.size())
.filter(i -> row.get(i) != null && !row.get(i).isEmpty())
.boxed()
.collect(Collectors.toSet());
System.out.println(columnNum); // 输出: [1, 3]⚠️ 注意事项:
- 空指针防护:StringUtils.isNotEmpty()(来自 Apache Commons Lang)可安全处理 null,但若仅用原生 .isEmpty(),务必先判空(如示例所示),否则 row.get(i) 为 null 时会抛 NullPointerException;
- 类型不可省略:boxed() 是关键步骤,缺失将导致编译失败(无法将 IntStream 直接转为 Collection)或运行时异常(强制类型转换失败);
- 性能考量:对超大列表(百万级),IntStream 方案简洁且并行友好(可替换为 parallel()),但若需极致性能且逻辑简单,传统 for 循环仍具优势;
- 替代方案:若使用 Apache Commons Collections,也可借助 IterableUtils.indexOf() 配合循环实现,但 Stream 方案更函数式、可读性高。
总结:获取条件索引的核心范式是 IntStream.range(0, size).filter(条件).boxed().collect(toSet())。牢记 boxed() 的桥梁作用,并始终兼顾 null 安全性,即可稳健应对各类索引筛选场景。
立即学习“Java免费学习笔记(深入)”;










