能否通过BufferedReader直接接收值存入List?有无类似数组的单行初始化方案
用BufferedReader结合Stream API一步初始化List的实现
完全可以做到和现有数组初始化风格完全匹配的链式写法,不需要额外手动遍历、循环add元素,从输入读取到List初始化的全流程可以在单次流调用中完成。
通用实现逻辑
和你现有int数组的读取链路完全复用,仅在流的收尾环节做小调整:
- 复用已有流程:通过
br.readLine()读入整行输入、trim()去除首尾空白、按\\s+分割为多段独立字符串 - 复用类型转换逻辑:通过
Integer::parseInt将每段字符串转换为整型数值 - 替换收尾逻辑:不再调用
toArray()生成数组,而是通过流收集器直接生成目标List
对应整型List的完整可运行代码:
List<Integer> numList = Arrays.stream(br.readLine().trim().split("\\s+")) .mapToInt(Integer::parseInt) .boxed() .collect(Collectors.toList());
关键步骤说明
boxed()的作用是把原始类型的IntStream转换为对象类型的Stream<Integer>,衔接后续的对象收集逻辑,不需要手动完成int到Integer的装箱转换collect(Collectors.toList())会自动把流中的所有元素汇总为List实例,全程没有手动循环添加元素的步骤,和你现有数组初始化的编码习惯完全一致。
常见场景适配
- 如果需要拿到支持增删改的可变ArrayList,而非JDK默认返回的不可变List实现,可以把最后一行收集逻辑替换为:
.collect(Collectors.toCollection(ArrayList::new))
- 如果不需要类型转换,仅需要把分割后的原始字符串直接存入List,写法会更简洁,连类型转换的步骤都可以省略:
List<String> strList = Arrays.stream(br.readLine().trim().split("\\s+")) .collect(Collectors.toList());
你给出的示例代码存在两处会导致编译报错的笔误,实际使用时需要修正:
trim()是带执行括号的方法调用,不要漏写括号;mapToInt的正确驼峰拼写为mapToInt,不要全小写写成maptoInt。
内容的提问来源于stack exchange,提问作者Pratyush
相关产品推荐
相关产品推荐

