Java函数式编程:使用Stream构建Competitors对象列表的实现问询
完善Java Stream实现Competitors列表的代码
需求:通过包含时间的int数组与包含名称的String数组,创建Competitors(实际为record)对象列表。以下是初始递归实现和未完成的Stream实现,我们来完善Stream版本。
初始递归实现代码
public static List<Competitors> makeObjects(int[] time, String[] name){ if (counter > name.length){ return racers; }else{ Competitors racer= new Competitors(name[counter],backToTime(time[counter])); racers.add(racer); return makeObjects(++counter,racers,time,name); } }
注:该实现依赖类级别的counter和racers变量,存在线程不安全问题
未完成的Stream实现代码
public static List<Competitors> makeObjects(int[] time, String[] name){ List<Competitors> racers = new ArrayList<Competitors>(); IntStream.range(0,time.length).mapToObj(i-> ).collect(new Competitors(name[i] ,backToTime(time[i]))) }
完善后的Stream实现
import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public static List<Competitors> makeObjects(int[] time, String[] name){ // 校验两个数组长度一致,避免数组越界 if (time.length != name.length) { throw new IllegalArgumentException("时间数组与名称数组长度必须相同"); } return IntStream.range(0, time.length) // 通过索引i匹配对应名称和转换后的时间,创建Competitors实例 .mapToObj(i -> new Competitors(name[i], backToTime(time[i]))) // 将Stream中的元素收集为List .collect(Collectors.toList()); }
关键修正点:
- 补全
mapToObj的lambda逻辑,直接返回Competitors实例,解决原代码缺失对象创建的问题 collect方法改用Collectors.toList(),原代码错误地直接传入对象实例,不符合Stream收集器的用法- 新增数组长度校验,避免因两个数组长度不一致导致的
ArrayIndexOutOfBoundsException - 无需提前创建
ArrayList,Stream的collect方法会直接生成并返回List,更符合函数式编程无状态的特点
内容的提问来源于stack exchange,提问作者mustafa qasmieh
相关产品推荐
相关产品推荐

