在 Java 8 里,IntStream 提供了生成连续整数序列的能力,可以很方便地用来遍历两个列表并建立动态索引映射,而不必依赖传统的下标 for 循环。

什么是双列表动态索引映射
双列表动态索引映射是指将两个列表按照位置索引进行配对,例如列表 A 的第 i 个元素对应列表 B 的第 i 个元素,并动态生成新的结构(如 Map 或自定义对象)。当列表长度可能变化时,这种映射需要在运行时根据索引动态完成。
使用 IntStream 实现基础映射
最常见的方式是使用 IntStream.range 生成索引,再通过 mapToObj 把两个列表的对应元素组合起来。
import java.util.*;
import java.util.stream.*;
public class IndexMapDemo {
public static void main(String[] args) {
List<String> names = Arrays.asList("张三", "李四", "王五");
List<Integer> scores = Arrays.asList(90, 85, 88);
// 以较短列表长度为准,避免索引越界
int size = Math.min(names.size(), scores.size());
Map<String, Integer> map = IntStream.range(0, size)
.boxed()
.collect(Collectors.toMap(
names::get,
scores::get
));
System.out.println(map);
}
}
处理不同长度列表
当两列表长度不一致时,应使用 Math.min 控制索引上界。如果希望以某个列表为主并补全默认值,可参考下面的写法:
import java.util.*;
import java.util.stream.*;
public class FillDemo {
public static void main(String[] args) {
List<String> keys = Arrays.asList("a", "b", "c", "d");
List<Integer> vals = Arrays.asList(1, 2);
Map<String, Integer> result = IntStream.range(0, keys.size())
.boxed()
.collect(Collectors.toMap(
i -> keys.get(i),
i -> i < vals.size() ? vals.get(i) : 0
));
System.out.println(result);
}
}
映射为自定义对象
除了 Map,也可以把两个列表映射成自定义对象列表,便于后续业务使用。
import java.util.*;
import java.util.stream.*;
class Pair {
String name;
int score;
Pair(String n, int s) { name = n; score = s; }
public String toString() { return name + ":" + score; }
}
public class ObjDemo {
public static void main(String[] args) {
List<String> names = Arrays.asList("张三", "李四");
List<Integer> scores = Arrays.asList(90, 85);
List<Pair> list = IntStream.range(0, Math.min(names.size(), scores.size()))
.mapToObj(i -> new Pair(names.get(i), scores.get(i)))
.collect(Collectors.toList());
System.out.println(list);
}
}
注意事项
- 使用 IntStream.range(a, b) 时,区间是前闭后开,不包含 b。
- 若列表可能为 null,应在方法入口做非空校验。
- 并行流 parallel 对简单索引映射提升有限,小数据量不建议使用。
动态索引映射的核心是利用整数流代替显式循环,让代码更声明式、更易维护。