Collectors.mapping Collectors.toList())出现All elements are null
时间: 2024-03-20 19:39:03 浏览: 86
如果 `Collectors.mapping` 和 `Collectors.toList()` 结合使用时出现 `All elements are null` 的异常,那么说明 `mapping` 方法返回的结果全部为 `null`,而 `toList` 方法不支持将全部为 `null` 的元素放入 `List` 中。
为了解决这个问题,可以在 `mapping` 方法中使用 `Optional` 对象,并在 `filter` 方法中排除 `Optional` 为空的情况,例如:
```
Collectors.mapping(o -> Optional.ofNullable(map.get(o.getNum())).filter(Objects::nonNull), Collectors.toList())
```
这样,如果 `map.get(o.getNum())` 返回 `null`,则 `Optional` 为空,会被过滤掉,不会将 `null` 值放入 `List` 中。
相关问题
Collectors.mapping(e -> deviceMap.get(e.getDeviceId()), Collectors.toList()) 出现了All elements are null
这个问题可能是因为 `deviceMap` 中不存在 `deviceRelatedList` 中某些元素的设备 ID,导致了 `deviceMap.get(e.getDeviceId())` 返回了 null,从而导致了 `mapping` 操作中的所有元素都是 null。
你可以在调用 `mapping` 之前先过滤掉 `deviceRelatedList` 中在 `deviceMap` 中不存在的设备 ID 对应的元素,或者在 `mapping` 操作中加入 null 值判断,避免出现空指针异常。
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 元素。
阅读全文