Collectors.groupingBy(SiteDeviceRelatedDO::getSiteId, Collectors.mapping(e -> deviceMap.get(e.getDeviceId()), Collectors.toList()))把deviceMap中获取到的null加入到list集合中,出现All elements are null
时间: 2024-03-19 18:45:49 浏览: 56
karaf
`Collectors.groupingBy(SiteDeviceRelatedDO::getSiteId, Collectors.mapping(e -> deviceMap.get(e.getDeviceId()), Collectors.toList()))` 的作用是将一个元素为 `e` 的流按照 `SiteDeviceRelatedDO` 对象的 `siteId` 属性进行分组,对于每个分组,将其中的元素 `e` 转化为对应的 `Device` 对象,然后将这些 `Device` 对象放入一个 List 中。
如果 `deviceMap.get(e.getDeviceId())` 返回了 null,那么这个 null 也会被加入到 List 中。如果整个流中的元素在 `deviceMap` 中均没有对应的 `Device`,那么就会得到一个 Map,其中所有的 value 都是一个 List,其中所有元素都是 null。
如果你希望在每个 List 中去掉所有的 null 元素,可以在 `Collectors.toList()` 后再调用 `stream().filter(Objects::nonNull).collect(Collectors.toList())` 进行过滤,如下所示:
```
Map<Long, List<Device>> siteDeviceMap = eventList.stream()
.collect(Collectors.groupingBy(
SiteDeviceRelatedDO::getSiteId,
Collectors.mapping(e -> deviceMap.get(e.getDeviceId())
.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList()),
Collectors.toList()
));
```
这里的 `eventList` 是一个元素为 `e` 的流,`deviceMap` 是一个从 `deviceId` 到 `Device` 的映射。首先,使用 `groupingBy` 操作将 `eventList` 中的元素按照 `SiteDeviceRelatedDO` 对象的 `siteId` 属性进行分组。然后,使用 `mapping` 操作将每个组中的元素 `e` 映射为对应的 `Device` 对象列表,如果 `deviceMap.get(e.getDeviceId())` 返回的是 null,那么这个 null 也会被映射到结果中。接着,使用 `filter` 操作过滤掉所有的 null 元素。最后,使用 `collect` 操作将过滤后的结果收集到一个 List 中,这个 List 中不会包含 null 元素。
阅读全文