java Map.forEach continue
时间: 2024-12-11 08:37:09 浏览: 12
`Map.forEach()` 是 Java 中对 `Map` 集合遍历的一种方法,它接受一个函数作为参数,该函数会对 `Map` 的每个条目(键值对)进行操作。当遍历时,如果在回调函数中使用了 `continue` 关键字,通常表示当前处理的条目不需要进一步处理,程序会直接跳到下一条记录。
例如:
```java
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
map.forEach((key, value) -> {
if (value > 1) { // 如果值大于1,则继续遍历下一个
System.out.println(key + " maps to " + value);
continue;
}
System.out.println("Skipped " + key); // 否则打印并忽略这个条目
});
```
在这个例子中,当遍历到值大于1的项时,会打印出键值对并继续下一次迭代;对于值不大于1的项,会选择跳过并不会执行 `System.out.println("Skipped " + key");` 这部分。
相关问题
代码优化 List<String> stringList = ExcelUtil.excelToShopIdList1(inputStream); if (CollectionUtils.isEmpty(stringStringMap)) { return warn("无数据"); } List<EquDeviceTslProperty> excelResult = new ArrayList<>(); stringList.forEach(ar->{ EquDeviceTslProperty equDeviceTslProperty = JSON.parseObject(ar, EquDeviceTslProperty.class); excelResult.add(equDeviceTslProperty); }); EquDeviceTslProperty deviceTslProperty = new EquDeviceTslProperty(); deviceTslProperty.setDeviceCode(excelResult.get(0).getDeviceCode()); List<EquDeviceTslProperty> equDeviceTslProperties = equDeviceTslPropertyService.selectEquDeviceTslPropertyList(deviceTslProperty); List<EquDeviceTslProperty> saveList = new ArrayList<>(); Map<String, List<EquDeviceTslProperty>> listMap = equDeviceTslProperties.stream().collect(Collectors.groupingBy(EquDeviceTslProperty::getPropertyId)); excelResult.forEach(ar->{ List<EquDeviceTslProperty> equDeviceTslProperties1 = listMap.get(ar.getPropertyId()); if (CollectionUtils.isEmpty(equDeviceTslProperties1)) { saveList.add(ar); return; } equDeviceTslProperties1.get(0).setValueType(ar.getValueType()) .setSortsIndex(ar.getSortsIndex()) .setPropertyName(ar.getPropertyName()); equDeviceTslPropertyService.updateEquDeviceTslProperty(equDeviceTslProperties1.get(0)); }); equDeviceTslPropertyService.batchInsert(saveList);
有一些地方可以进行优化:
1. 在 `if (CollectionUtils.isEmpty(stringStringMap))` 中,你返回了一个 `"无数据"` 的字符串。但是这个字符串并没有什么实际用处,因为在下面的代码中并没有使用到它。因此,你可以直接在这个 if 语句中返回一个空的 List,这样可以避免后面的代码无意义地执行。
2. 在 `stringList.forEach(ar->{ EquDeviceTslProperty equDeviceTslProperty = JSON.parseObject(ar, EquDeviceTslProperty.class); excelResult.add(equDeviceTslProperty); });` 中,你使用了 forEach 循环遍历 `stringList`,并将遍历到的每个元素转换成一个 `EquDeviceTslProperty` 对象,然后将这个对象添加到 `excelResult` 中。但是,这个转换的过程可以使用 stream 和 map 操作来简化代码,如下所示:
```java
List<EquDeviceTslProperty> excelResult = stringList.stream()
.map(ar -> JSON.parseObject(ar, EquDeviceTslProperty.class))
.collect(Collectors.toList());
```
3. 在 `List<EquDeviceTslProperty> equDeviceTslProperties = equDeviceTslPropertyService.selectEquDeviceTslPropertyList(deviceTslProperty);` 中,你查询了数据库,获取了一些设备的属性信息。但是,这个查询操作可能会比较耗时,因此你可以考虑将这个查询操作移到后面的代码中,只查询需要用到的属性信息。
4. 在 `Map<String, List<EquDeviceTslProperty>> listMap = equDeviceTslProperties.stream().collect(Collectors.groupingBy(EquDeviceTslProperty::getPropertyId));` 中,你使用了 stream 和 groupingBy 操作将 `equDeviceTslProperties` 中的元素按照 `propertyId` 分组。这个操作可以简化代码,但是可能会比较耗时,因此你可以考虑将 `equDeviceTslProperties` 中的元素排序,然后使用 for 循环遍历,将元素按照 `propertyId` 分组,这样可以提高代码的执行效率。
5. 在 `excelResult.forEach(ar->{ List<EquDeviceTslProperty> equDeviceTslProperties1 = listMap.get(ar.getPropertyId()); if (CollectionUtils.isEmpty(equDeviceTslProperties1)) { saveList.add(ar); return; } equDeviceTslProperties1.get(0).setValueType(ar.getValueType()) .setSortsIndex(ar.getSortsIndex()) .setPropertyName(ar.getPropertyName()); equDeviceTslPropertyService.updateEquDeviceTslProperty(equDeviceTslProperties1.get(0)); });` 中,你使用了 forEach 循环遍历 `excelResult`,并根据每个元素的 `propertyId` 查找 `equDeviceTslProperties` 中对应的元素,然后更新它们的属性信息。但是,这个操作可能会比较耗时,因此你可以考虑将 `excelResult` 中的元素排序,然后使用 for 循环遍历,根据每个元素的 `propertyId` 查找对应的元素,并更新它们的属性信息,这样可以提高代码的执行效率。同时,你可以将不需要更新的元素添加到 `saveList` 中,然后一次性将它们插入到数据库中,这样可以减少数据库操作的次数。
综上所述,优化后的代码如下所示:
```java
List<EquDeviceTslProperty> excelResult = ExcelUtil.excelToShopIdList1(inputStream).stream()
.map(ar -> JSON.parseObject(ar, EquDeviceTslProperty.class))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(excelResult)) {
return Collections.emptyList();
}
excelResult.sort(Comparator.comparing(EquDeviceTslProperty::getPropertyId));
List<EquDeviceTslProperty> equDeviceTslProperties = equDeviceTslPropertyService.selectEquDeviceTslPropertyList(new EquDeviceTslProperty().setDeviceCode(excelResult.get(0).getDeviceCode()));
List<EquDeviceTslProperty> saveList = new ArrayList<>();
int i = 0;
for (EquDeviceTslProperty ar : excelResult) {
List<EquDeviceTslProperty> equDeviceTslProperties1 = new ArrayList<>();
while (i < equDeviceTslProperties.size() && equDeviceTslProperties.get(i).getPropertyId().equals(ar.getPropertyId())) {
equDeviceTslProperties1.add(equDeviceTslProperties.get(i));
i++;
}
if (equDeviceTslProperties1.isEmpty()) {
saveList.add(ar);
continue;
}
EquDeviceTslProperty equDeviceTslProperty = equDeviceTslProperties1.get(0);
equDeviceTslProperty.setValueType(ar.getValueType())
.setSortsIndex(ar.getSortsIndex())
.setPropertyName(ar.getPropertyName());
equDeviceTslPropertyService.updateEquDeviceTslProperty(equDeviceTslProperty);
}
equDeviceTslPropertyService.batchInsert(saveList);
```
优化 private void addReferencedKpi(List<SimulationTableDto> list, List<String> codeList, List<Map<String, List<String>>> referencedList) { if (CollectionUtils.isEmpty(list) || CollectionUtils.isEmpty(codeList) || CollectionUtils.isEmpty(referencedList)) { return; } // 转换结构 key1-table key2-column value-codeList Map<String, Map<String, List<String>>> tableColumnWithCodeListMap = Maps.newHashMap(); int size = referencedList.size(); for (int i = 0; i < size; i++) { String code = codeList.get(i); Map<String, List<String>> referencedPerMap = referencedList.get(i); if (MapUtils.isEmpty(referencedPerMap)) { continue; } referencedPerMap.forEach((table, columns) -> { tableColumnWithCodeListMap.putIfAbsent(table, Maps.newHashMap()); for (String column : columns) { tableColumnWithCodeListMap.get(table).putIfAbsent(column, Lists.newArrayList()); tableColumnWithCodeListMap.get(table).get(column).add(code); } }); } for (SimulationTableDto simulationTableDto : list) { String simTableName = simulationTableDto.getTableName(); String simTitle = simulationTableDto.getColumn().getTitle(); if (!tableColumnWithCodeListMap.containsKey(simTableName) || !tableColumnWithCodeListMap.get(simTableName).containsKey(simTitle)) { continue; } List<String> referencedCodeList = tableColumnWithCodeListMap.get(simTableName).get(simTitle); simulationTableDto.getColumn().setReferencedKpis(referencedCodeList); } }
可以尝试优化一下代码结构,减少嵌套层数,使得代码更加易读和易维护。例如可以将转换结构的代码抽取成一个单独的方法,用于处理每个 referencedPerMap 中的数据,并返回转换后的表格和列名以及对应的 codeList 的 Map 对象。同时,可以考虑使用 Java 8 的 Stream API,更加简洁地实现循环操作。修改后的代码如下:
```
private void addReferencedKpi(List<SimulationTableDto> list, List<String> codeList, List<Map<String, List<String>>> referencedList) {
if (CollectionUtils.isEmpty(list) || CollectionUtils.isEmpty(codeList) || CollectionUtils.isEmpty(referencedList)) {
return;
}
// 转换结构 key1-table key2-column value-codeList
Map<String, Map<String, List<String>>> tableColumnWithCodeListMap = new HashMap<>();
referencedList.forEach(referencedPerMap -> {
if (MapUtils.isEmpty(referencedPerMap)) {
return;
}
referencedPerMap.forEach((table, columns) -> {
tableColumnWithCodeListMap.computeIfAbsent(table, k -> new HashMap<>());
columns.forEach(column -> tableColumnWithCodeListMap.get(table).computeIfAbsent(column, k -> new ArrayList<>()).addAll(codeList));
});
});
list.forEach(simulationTableDto -> {
String simTableName = simulationTableDto.getTableName();
String simTitle = simulationTableDto.getColumn().getTitle();
tableColumnWithCodeListMap.computeIfPresent(simTableName, (table, columnMap) -> {
if (columnMap.containsKey(simTitle)) {
simulationTableDto.getColumn().setReferencedKpis(columnMap.get(simTitle));
}
return columnMap;
});
});
}
```
阅读全文