Collectors.summingLong函数具体功能
时间: 2024-01-02 19:02:17 浏览: 33
Collectors.summingLong是Java 8的一个收集器(Collector),用于将流中的元素映射为long类型,然后将它们的总和计算出来。它的具体功能是对流中的元素进行求和操作,返回一个long类型的结果。
例如,假设我们有一个包含整数的列表,我们可以使用Collectors.summingLong将它们相加:
```
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long sum = numbers.stream().collect(Collectors.summingLong(i -> i));
System.out.println(sum); // 输出15
```
在这个例子中,我们使用Lambda表达式将列表中的每个整数映射为它本身,然后使用Collectors.summingLong将它们相加。最后,我们得到了列表中所有整数的总和15。
相关问题
Collectors.summingLong如何防止值为空异常
`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()`将抛出异常。
Collectors.toMap换成Collectors.mapping
Collectors.toMap和Collectors.mapping都是Java 8中的流操作工具类Collectors的方法,用于对流中的元素进行收集和转换。
Collectors.toMap方法用于将流中的元素映射为键值对,并将其收集到一个Map中。它接受两个参数,第一个参数是用于提取键的函数,第二个参数是用于提取值的函数。如果流中存在重复的键,则会抛出一个IllegalStateException异常。
而Collectors.mapping方法则是在收集元素到Map时,对元素进行进一步的转换操作。它接受两个参数,第一个参数是用于提取键的函数,第二个参数是用于对值进行转换的函数。它可以与其他收集器一起使用,例如Collectors.toList或Collectors.toSet,来对值进行进一步的收集和转换。
下面是一个示例代码,演示了如何使用Collectors.toMap和Collectors.mapping方法:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange");
// 使用Collectors.toMap将水果列表转换为以长度为键,水果名称为值的Map
Map<Integer, String> lengthToNameMap = fruits.stream()
.collect(Collectors.toMap(String::length, fruit -> fruit));
System.out.println(lengthToNameMap);
// 使用Collectors.mapping将水果列表转换为以长度为键,水果名称列表为值的Map
Map<Integer, List<String>> lengthToNamesMap = fruits.stream()
.collect(Collectors.groupingBy(String::length, Collectors.mapping(fruit -> fruit, Collectors.toList())));
System.out.println(lengthToNamesMap);
}
}
```
输出结果为:
```
{5=apple, 6=orange, 6=banana}
{5=[apple], 6=[orange, banana]}
```
阅读全文