如何用Java 8实现列表数值平方、过滤后求剩余数平均值?
Java 8 实现数值列表平方、过滤后求平均值
完整代码实现
下面是补全后的完整代码,包含平方、过滤、求平均值的完整流程:
import java.util.List; import java.util.OptionalDouble; public class SquaredAverageCalculator { public static void main(String[] args) { List<Integer> numbers = List.of(12, 9, 13, 4, 6, 2, 4, 12, 15); // 计算平方后大于100的数值的平均值 OptionalDouble average = numbers.stream() .mapToInt(num -> num * num) // 将元素转为int类型,避免装箱开销 .filter(squaredNum -> squaredNum > 100) // 过滤出平方值大于100的元素 .average(); // 计算平均值 // 处理结果:避免空流导致的异常 if (average.isPresent()) { System.out.println("符合条件的数值平均值为: " + average.getAsDouble()); } else { System.out.println("没有找到平方值大于100的数值,无法计算平均值"); } // 也可以直接用orElse设置默认值 double avgResult = average.orElse(0.0); System.out.println("平均值(无符合条件时默认0): " + avgResult); } }
各步骤详细解释
- 平方运算:使用
mapToInt(num -> num * num)替代普通的map,将Stream<Integer>转为IntStream,避免自动装箱/拆箱的性能损耗,同时后续的数值计算更高效。 - 过滤操作:
filter(squaredNum -> squaredNum > 100)保留平方后大于100的元素,原列表平方后的结果为[144, 81, 169, 16, 36, 4, 16, 144, 225],过滤后剩下[144, 169, 144, 225]。 - 求平均值的核心逻辑:
average()是IntStream提供的终端操作,会计算流中所有元素的平均值,返回OptionalDouble类型。- 使用
OptionalDouble的原因是:如果过滤后的流为空(比如所有元素平方后都≤100),直接调用getAsDouble()会抛出NoSuchElementException,而OptionalDouble可以安全处理这种空值场景。 - 你可以通过
isPresent()判断是否有有效平均值,或者用orElse(0.0)直接获取结果(空流时返回0.0作为默认值)。
手动验证计算结果
过滤后的元素总和:144 + 169 + 144 + 225 = 682
元素数量:4个
平均值:682 / 4 = 170.5,和代码运行结果一致。
内容的提问来源于stack exchange,提问作者Chärming ßoy
相关产品推荐
相关产品推荐

