IntStream平均值的打印结果

时间:2018-09-30 22:29:12

标签: java java-8 java-stream optional

我目前正在学习流,并且正在使用.average函数计算使用扫描仪输入的一些整数的平均值。 我遇到的问题是如何格式化输出,以便它不会显示可选的double。

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ClassAverage {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    List<Integer> grades = new ArrayList<Integer>();

    while (scan.hasNextInt()) {
        grades.add(scan.nextInt());

        if (scan.equals("end")) {
            {
                break;
            }

        }
        grades.forEach(System.out::println);

    }

    System.out.println("" + grades.stream()
            .mapToInt(Integer::intValue)
            .average());

}
}

这是我得到的输出

 OptionalDouble[88.0]

2 个答案:

答案 0 :(得分:4)

average()返回一个OptionalDouble对象,而不是double

如果您只需执行一个操作即可对结果进行处理(例如打印结果),则可以使用ifPresent​(DoubleConsumer)

grades.stream()
        .mapToInt(Integer::intValue)
        .average()
        .ifPresent(System.out::println);

否则,

OptionalDouble optionalAverage = grades.stream()
        .mapToInt(Integer::intValue)
        .average();

if (optionalAverage.isPresent()) {
    double average = optionalAverage.getAsDouble();
    System.out.println(average);
}

答案 1 :(得分:1)

您可以使用orElse来检索由double包装的实际OptionalDouble值。

这样做的话,当Optional为空时(在这种情况下,我使用的是0.0),您还可以确定默认值:

System.out.println("" + grades.stream()
        .mapToInt(Integer::intValue)
        .average()
        .orElse(0.0)
);