Java 8中如何通过stream()和map()返回double类型数组?
解决Java Stream返回
double[]类型数组的问题 嘿,这个问题我之前也踩过坑!你遇到的类型不兼容错误,根源在于你用的toArray()默认方法会返回Object[],而你需要的是原始类型的double[]。咱们来一步步修正这个方法:
问题原因
你用map(paramAnalysis -> Double.valueOf(paramAnalysis.getMax()))把double值装箱成了Double包装类,然后调用无参的toArray()时,Java Stream默认会生成Object[]数组,而Java不允许直接把Object[]强制转换为double[],所以抛出了那个编译错误。
最优解决方案:用mapToDouble处理原始类型
既然你的getMax()方法返回的是double原始类型,直接用mapToDouble()代替map()就可以完美解决问题。这个方法会返回DoubleStream,它的toArray()方法正好返回double[]类型,完全匹配你的方法返回值:
public static double[] getMaxesFromDb(FileDb fileDb){ return fileDb.getParamsAnaylsis().stream() .mapToDouble(ParamAnalysis::getMax) // 直接提取double原始值,避免装箱 .toArray(); }
备选方案:指定数组生成器(如果需要保留装箱操作)
如果你因为某些原因必须先装箱成Double,可以在toArray()里传入一个数组生成器,告诉Stream要生成double[]:
public static double[] getMaxesFromDb(FileDb fileDb){ return fileDb.getParamsAnaylsis().stream() .map(ParamAnalysis::getMax) // 自动装箱为Double .toArray(double[]::new); // 指定生成double[]数组 }
或者也可以用mapToDouble(Double::doubleValue)把Double拆箱回double再生成数组,不过这就多了一步不必要的装箱拆箱操作,不如第一种方法高效。
小提示
记得检查fileDb.getParamsAnaylsis()会不会返回null,如果有这个可能,建议加个空值防护,避免空指针异常:
public static double[] getMaxesFromDb(FileDb fileDb){ return Optional.ofNullable(fileDb.getParamsAnaylsis()) .orElse(Collections.emptyList()) .stream() .mapToDouble(ParamAnalysis::getMax) .toArray(); }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

