Java中float与Optional<Float>做除法提示运算符未定义如何解决
问题原因
你遇到的编译错误是因为/运算符不支持float基础类型和Optional<Float>容器类型直接运算。Optional<Float>是Java用来规避空指针的包装类,不能直接当成数值使用,你需要先从中取出实际的浮点数值再做除法。
解决方案
你可以根据场景选以下任意一种实现:
方案1:给reduce方法指定初始值,直接得到浮点结果(最适合你的场景)
因为你固定要输入3个权重,权重集合一定非空,你可以给reduce方法传入初始值0f,直接返回求和后的float值,不需要处理Optional:
// 把原来的Optional<Float>那行替换成下面的代码 float sumOfWeights = wheightes.stream().reduce(0f, Float::sum); // 除法直接用sumOfWeights即可 System.out.println("A média ponderada é " + weightedAverage / sumOfWeights);
方案2:从Optional中取出值再运算
如果你要保留原来的无初始值reduce写法,可以调用Optional的get()方法取出内部值,因为你的场景下集合一定非空,不会出现空值报错:
System.out.println("A média ponderada é " + weightedAverage / sumOfWheightes.get());
如果要增加鲁棒性,也可以加默认值兜底:
float sum = sumOfWheightes.orElse(1f); // 如果权重和为空默认取1,避免除以0 System.out.println("A média ponderada é " + weightedAverage / sum);
其他代码逻辑问题修复建议
你当前的代码还有几个隐含逻辑错误需要修正:
- 每个
case分支末尾缺少break语句,会触发分支穿透,比如输入1执行完算术平均逻辑后,还会继续执行加权平均和默认分支的代码。 case逻辑和输入提示不符:你提示用户输入1算加权平均、输入2算算术平均,但代码中case1写的是算术平均逻辑,case2写的是加权平均逻辑,二者搞反了。- 拼写问题:
wheightes、wheight属于拼写错误,正确写法为weights、weight,不会影响运行但会降低代码可读性。
内容的提问来源于stack exchange,提问作者Luiz Portela
相关产品推荐
相关产品推荐

