使用Java Stream reduce求和为何输出Optional[234]而非234?
为什么Java Stream的reduce方法返回Optional包裹的结果?
你遇到的Optional[234]输出,是因为调用的是**Stream.reduce(BinaryOperatorOptional<T>,原因如下:
- 这个版本的reduce没有指定初始值,如果处理的是空流,就没有合法结果可以返回。Java用
Optional显式表达「结果可能不存在」的场景,避免空指针问题。 - 你的非空列表计算出了234,所以Optional会把这个值包裹起来,输出时就显示为
Optional[234]。
解决方法
有两种常见的修正方式:
1. 指定初始值(推荐)
使用带初始值的reduce重载方法reduce(T identity, BinaryOperator<T> accumulator),即使是空流,也会返回你指定的初始值(比如求和的初始值0),返回值类型就是具体的int,不再是Optional:
private static void printSumOfAllNumbersInListUsingFP(List<Integer> list) { // 指定初始值0,返回int类型 int sum = list.stream().reduce(0, PStructured01::printSum); System.out.println(sum); }
2. 从Optional中提取值
如果你想保留Optional的语义(比如需要处理空流的情况),可以用get()、orElse()等方法提取内部值:
private static void printSumOfAllNumbersInListUsingFP(List<Integer> list) { Optional<Integer> sumOptional = list.stream().reduce(PStructured01::printSum); // 空流时返回默认值0 int sum = sumOptional.orElse(0); System.out.println(sum); }
完整修改后的代码示例
public static void main(String[] args) { printSumOfAllNumbersInList(List.of(12,45,34,22,56,65)); printSumOfAllNumbersInListUsingFP(List.of(12,45,34,22,56,65)); } private static void printSumOfAllNumbersInListUsingFP(List<Integer> list) { int sum = list.stream().reduce(0, PStructured01::printSum); System.out.println(sum); } private static int printSum(int a,int b) { int sum = a + b; return sum; } private static void printSumOfAllNumbersInList(List<Integer> list) { int sum = 0; for (Integer integer: list) { sum = sum + integer; } System.out.println(sum); }
内容的提问来源于stack exchange,提问作者Aashika Jain
相关产品推荐
相关产品推荐

