Collectors.summingLong如何防止值为空异常
时间: 2024-09-27 17:16:24 浏览: 27
`Collectors.summingLong`是Java 8 Stream API中的一个收集器,它用于计算流中所有Long类型的元素之和。当你直接使用它时,如果流中没有元素,或者某个元素不是Long类型,会抛出`NoSuchElementException`或`ArithmeticException`异常。
为了避免这种异常,你可以采取以下几种策略:
1. **检查流是否为空**:在调用`summingLong()`之前,可以先使用`anyMatch()`或者`findFirst()`来确认流是否非空,如:
```java
if (!stream.isEmpty()) {
long sum = stream.mapToLong(Long::longValue).sum();
}
```
2. **处理非Long元素**:在转换流元素前,你可以使用`filter()`方法过滤掉非Long类型的元素:
```java
Optional<Long> sumOption = stream.filter(Objects::nonNull)
.mapToLong(Long::longValue)
.reduce(0L, Long::sum);
long sum = sumOption.orElseThrow(() -> new IllegalArgumentException("Stream contains non-long values"));
```
3. **使用Optional Double**:如果你确定不会有负数出现,可以使用`summingDouble()`并包装结果到`OptionalDouble`中,这样异常可以在获取结果时处理:
```java
OptionalDouble result = stream.mapToDouble(a -> a).summingDouble();
double sum = result.getAsDouble();
```
在上述代码中,如果没有可用的长整型数值,`orElseThrow()`或`getAsDouble()`将抛出异常。
阅读全文