siteDeviceMap = deviceRelatedList.stream().collect(Collectors.groupingBy(SiteDeviceRelatedDO::getSiteId, Collectors.mapping(e -> deviceMap.get(e.getDeviceId()), Collectors.toList()))); 中出现了All elements are null
时间: 2024-04-05 20:31:40 浏览: 78
这个问题可能是因为 `deviceRelatedList` 中的某些元素的 `SiteDeviceRelatedDO::getSiteId` 返回了 null,导致了 `groupingBy` 操作的 key 值为 null,进而导致了 `mapping` 操作中的 `deviceMap.get(e.getDeviceId())` 调用了 null,从而抛出了空指针异常。
你可以在调用 `groupingBy` 之前先过滤掉 `deviceRelatedList` 中 `SiteDeviceRelatedDO::getSiteId` 返回 null 的元素,或者在 `mapping` 操作中加入 null 值判断,避免出现空指针异常。
相关问题
Map<Long, List<List<RealtimeDataAO>>> collect = siteDeviceRelatedList.stream().collect(Collectors.groupingBy(SiteDeviceRelatedDO::getSiteId, Collectors.mapping(o -> deviceRealtimeMap.get(o.getDeviceId()), Collectors.toList())));怎么返回值变成Map<Long, List<RealtimeDataAO>>形式
要将 `Map<Long, List<List<RealtimeDataAO>>>` 转换为 `Map<Long, List<RealtimeDataAO>>` 的形式,可以使用 `flatMap` 和 `collect` 方法来实现。 代码示例如下:
```java
Map<Long, List<RealtimeDataAO>> collect = siteDeviceRelatedList.stream()
.collect(Collectors.groupingBy(SiteDeviceRelatedDO::getSiteId,
Collectors.mapping(o -> deviceRealtimeMap.get(o.getDeviceId()), Collectors.toList())))
.entrySet().stream()
.flatMap(e -> e.getValue().stream().flatMap(List::stream)
.map(item -> new AbstractMap.SimpleEntry<>(e.getKey(), item)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
```
代码中使用 `entrySet` 方法将 `Map<Long, List<List<RealtimeDataAO>>>` 转换为 `Stream<Map.Entry<Long, List<List<RealtimeDataAO>>>>`,然后使用 `flatMap` 方法将 `List<List<RealtimeDataAO>>` 打平为 `List<RealtimeDataAO>`。接着使用 `map` 方法将 `List<RealtimeDataAO>` 中的元素与对应的 `siteId` 组成一个新的 `Map.Entry` 对象。最后再使用 `groupingBy` 和 `mapping` 方法将 `Map.Entry<Long, RealtimeDataAO>` 转换为 `Map<Long, List<RealtimeDataAO>>` 的形式。
Collectors.groupingBy(SiteDeviceRelatedDO::getSiteId, Collectors.mapping(e -> deviceMap.get(e.getDeviceId()), Collectors.toList()))把deviceMap中获取到的null加入到list集合中,出现All elements are null
`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 元素。
阅读全文