通过stream流一次性实现
时间: 2024-11-12 12:39:26 浏览: 10
node.js使用stream模块实现自定义流示例
在Java中,如果你想要通过Stream API来一次性地统计`Task`列表中每个库位的任务数量,并最终得到`Map<String, Integer>`,可以这样做:
首先,创建一个函数来获取库位名并计算任务数量:
```java
Map<String, Long> countByLocation(List<Task> tasks, LocationService locationService) {
return tasks.stream()
.map(task -> locationService.getLocationName(task.locationId))
.collect(Collectors.groupingBy(name -> name, Collectors.counting()));
}
```
这个函数做了以下几件事:
- `stream()`:将`List<Task>`转换为一个流(Stream),便于操作。
- `.map()`:对每个任务应用`locationService.getLocationName()`,得到库位名。
- `.collect(groupingBy...)`:收集所有同名的库位,使用`Collectors.counting()`计算每个组(即库位名)的数量。
结果将是一个`Map<String, Long>`,因为`counting()`默认生成的是`Long`类型的计数,如果你需要`Integer`类型,可以在最后调用`values().mapToInt(Long::intValue)`。
```java
Map<String, Integer> intCountMap = countByLocation(tasks, locationService).entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue + newValue,
LinkedHashMap::new // 保持插入顺序
));
```
这里我们再次使用了Stream,将`Long`型计数映射回`Integer`,并将结果放入一个新的`Map<String, Integer>`中。
阅读全文