如何基于多个并行数组生成包含Stats对象的Stream流
解决方案
你原来的写法错误在于Stream.of(time, pace, rating, height, position)会生成一个包含5个数组对象的流,无法获取到不同数组相同索引的对应值。正确的做法是基于索引生成流,遍历每个下标,从五个数组中分别取出对应下标的值构建Stats对象。
注意事项
- 必须保证所有数组长度一致,否则会出现数组越界异常,建议增加前置校验逻辑
- 你当前代码里
Stats构造方法要求的position类型是LatLon,但Trip类里的position数组是LatLng类型,需要先统一两个类型,或者补充类型转换逻辑,以下示例默认你已经处理了类型兼容问题
完整实现代码
public Stream<Stats> tripStats() { // 前置校验:所有属性数组长度一致,可根据需求调整异常类型 int arrayLength = time.length; if (pace.length != arrayLength || rating.length != arrayLength || height.length != arrayLength || position.length != arrayLength) { throw new IllegalArgumentException("所有属性数组的长度必须保持一致"); } // 生成索引流,逐个下标取数构建Stats对象 return IntStream.range(0, arrayLength) .mapToObj(index -> new Stats( time[index], pace[index], rating[index], height[index], position[index] // 若类型不匹配,此处补充转换逻辑即可,比如position[index].convertToLatLon() )); }
代码说明
IntStream.range(0, arrayLength)会生成从0到arrayLength-1的连续整数流,刚好对应所有数组的合法下标mapToObj方法会把每个下标转换为对应的Stats对象,最终返回的就是符合要求的Stream<Stats>类型结果
内容的提问来源于stack exchange,提问作者Bob Jones
相关产品推荐
相关产品推荐

