我目前正在学习流,并且正在使用.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]
答案 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)
);