Java 8如何用一行代码实例化并填充ArrayList?
Java 8 一行式初始化并填充 ArrayList 的方案
当然可以实现!Java 8 引入的 Stream API 完美解决了这个问题,能写出和 Python 列表推导式一样简洁的一行代码,不用再分开做实例化和插入操作。
两种核心写法:
1. 以 List 接口接收(无需强指定 ArrayList 类型)
如果你的变量声明是List<Integer>,可以直接借助Collectors.toList()完成:
List<Integer> numberList = IntStream.range(0, n + 1) .filter(number -> number % 3 == 0) .boxed() .collect(Collectors.toList());
这里的boxed()是关键步骤——把IntStream中的基础类型int转换成包装类Integer,适配ArrayList的泛型要求。
2. 明确生成 ArrayList 实例
如果必须要ArrayList<Integer>类型(而非List接口),可以用Collectors.toCollection()指定具体的集合实现:
ArrayList<Integer> numberList = IntStream.range(0, n + 1) .filter(number -> number % 3 == 0) .boxed() .collect(Collectors.toCollection(ArrayList::new));
这个写法会直接生成ArrayList实例,完全匹配你想要的“一行完成实例化+元素插入”的需求。
额外补充(Java 9+ 简化写法)
如果你的项目使用 Java 9 及以上版本,还有更简洁的不可变集合写法,但注意List.of()返回的是不可变列表,后续无法添加元素:
List<Integer> numberList = List.of(IntStream.range(0, n + 1) .filter(number -> number % 3 == 0) .boxed() .toArray(Integer[]::new));
但如果需要可变的ArrayList,还是推荐前面 Stream + toCollection的方案。
这样一行代码就完成了所有操作,和你 Python 里的numberList = [number for number in range(0, n + 1) if number % 3 == 0]功能完全等价!
内容的提问来源于stack exchange,提问作者Alessandro Bardini
相关产品推荐
相关产品推荐

