You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());
}

关键修正点:

  1. 补全mapToObj的lambda逻辑,直接返回Competitors实例,解决原代码缺失对象创建的问题
  2. collect方法改用Collectors.toList(),原代码错误地直接传入对象实例,不符合Stream收集器的用法
  3. 新增数组长度校验,避免因两个数组长度不一致导致的ArrayIndexOutOfBoundsException
  4. 无需提前创建ArrayList,Stream的collect方法会直接生成并返回List,更符合函数式编程无状态的特点

内容的提问来源于stack exchange,提问作者mustafa qasmieh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:11:20