解释一下这段代码:Set<String> plugSdk = plugExportDTO.getPlugInfoExportDTOList().stream().filter(plugInfoExportDTO -> plugInfoExportDTO.getPlugSdk() != null ) .collect(Collectors.mapping(PlugInfoExportDTO::getPlugSdk, Collectors.toSet()));
时间: 2023-05-15 14:06:35 浏览: 57
这段代码是使用 Java 8 的 Stream API 对一个包含 PlugInfoExportDTO 对象的列表进行过滤和映射操作,最终得到一个 Set<String> 类型的结果。具体来说,代码首先使用 filter() 方法过滤掉 PlugInfoExportDTO 对象中 plugSdk 属性为 null 的元素,然后使用 mapping() 方法将剩余元素的 plugSdk 属性映射为 String 类型,最后使用 toSet() 方法将结果收集到一个 Set 集合中。
相关问题
解释一下这段代码: Set<String> plugSdk = plugExportDTO.getPlugInfoExportDTOList().stream().filter(plugInfoExportDTO ->plugInfoExportDTO.getPlugSdk() != null ).collect(Collectors.mapping(PlugInfoExportDTO::getPlugSdk, Collectors.toSet()));
这段代码使用了 Java 8 的 Stream API,首先从 plugExportDTO 对象中获取一个 PlugInfoExportDTO 对象列表,然后使用 filter 方法过滤掉 PlugInfoExportDTO 对象中 plugSdk 属性为 null 的对象,接着使用 mapping 方法将 PlugInfoExportDTO 对象转换为 plugSdk 属性的值,最后使用 toSet 方法将所有的值收集到一个 Set 集合中。简单来说,这段代码的作用是从一个 PlugExportDTO 对象中提取出所有非空的 plugSdk 属性值,并将它们存储到一个 Set 集合中。
List<String> landsForVillages = feignBasicController.getLandsForVillages(id); List<DevInfo> devByBaseId = feignHdController.getDevByBaseId(userInfo.getId(), classify); List<String> machineIds = devByBaseId.stream().map(DevInfo::getId).collect(Collectors.toList()); Set<String> machineIdList = new HashSet<>(); // json转化为list for (String machineId : machineIds) { List<String> landIdsList = baseMapper.getLandIdsById(machineId); for (String landIdStr : landIdsList) { if(StringUtils.isNotBlank(landIdStr)){ JSONArray arrayStr = JSON.parseArray(landIdStr); for (Object o : arrayStr) { if (landsForVillages.contains(o)) { // 村下面的工作设备 machineIdList.add(machineId); } } } } } 优化一下代码
可以尝试使用 Java 8 的 Stream API 重构代码,如下所示:
```
Set<String> machineIdList = devByBaseId.stream()
.map(DevInfo::getId)
.flatMap(machineId -> baseMapper.getLandIdsById(machineId).stream())
.filter(StringUtils::isNotBlank)
.flatMap(landIdStr -> JSON.parseArray(landIdStr).stream())
.distinct()
.filter(landsForVillages::contains)
.map(machineIdList::add)
.collect(Collectors.toSet());
```
这段代码首先使用 `flatMap` 将 `devByBaseId` 中的每个 `DevInfo` 转换为其对应的 `machineId`,然后对于每个 `machineId`,调用 `baseMapper.getLandIdsById` 获取其对应的 `landIdsList`,并将其转换为一个 `Stream<String>`。接着对于每个 `landIdStr`,使用 `JSON.parseArray` 将其转换为一个 `JSONArray`,然后将其中的每个元素转换为 `String`,并去重。最后,使用 `filter` 过滤出 `landsForVillages` 中包含的元素,并将其对应的 `machineId` 添加到 `machineIdList` 中,最终使用 `collect` 将其转换为一个 `Set<String>`。
阅读全文