Map<String, Object> mergedMap = ruleDtls.stream().flatMap(map -> map.entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue));增加判断getvalue是否为空,为空就添加为“”
时间: 2023-12-30 17:06:14 浏览: 30
可以在 `flatMap` 中增加判断 `getValue()` 是否为空,如果为空则将其设为一个空字符串 `""`。代码如下:
```
Map<String, Object> mergedMap = ruleDtls.stream()
.flatMap(map -> map.entrySet().stream()
.map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue() == null ? "" : entry.getValue())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue));
```
这里使用了 `AbstractMap.SimpleEntry` 来创建一个新的键值对,如果原始 map 中某个键对应的值为 null,则将其值替换为一个空字符串 `""`。
相关问题
for (Entity e : rsList) { List<String> singleRecord = new ArrayList<>(); nameList.forEach(n -> singleRecord.add(e.get(n) == null ? "" : e.get(n).toString())); if (e.getMetadata().containsKey(ChargeConst.RATE_RULE_DETAIL)) { Set<Map<String, Object>> ruleDtls = (Set<Map<String, Object>>) e.getMetadata().get(ChargeConst.RATE_RULE_DETAIL); Map<Object, Object> mergedMap = ruleDtls.stream() .flatMap(map -> map.entrySet().stream().map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue() == null ? "" : entry.getValue()))) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue)); final List<String> finalSingleRecord = singleRecord; valueList.add(IntStream.range(0, finalSingleRecord.size()).mapToObj( i -> finalSingleRecord.get(i).equals("") && mergedMap.get(nameList.get(i)) != null ? mergedMap.get(nameList.get(i)).toString() : finalSingleRecord.get(i)) .collect(Collectors.toList())); continue; } valueList.add(singleRecord); }降低代码复杂度
可以将代码分解为多个方法来降低复杂度,例如:
1. 提取一个方法来处理每个实体记录,将其转换为一个 String 类型的 List。
```
private List<String> processEntity(Entity e, List<String> nameList) {
List<String> singleRecord = new ArrayList<>();
nameList.forEach(n -> singleRecord.add(e.get(n) == null ? "" : e.get(n).toString()));
if (e.getMetadata().containsKey(ChargeConst.RATE_RULE_DETAIL)) {
Set<Map<String, Object>> ruleDtls = (Set<Map<String, Object>>) e.getMetadata().get(ChargeConst.RATE_RULE_DETAIL);
Map<Object, Object> mergedMap = mergeRuleDetails(ruleDtls);
final List<String> finalSingleRecord = singleRecord;
return IntStream.range(0, finalSingleRecord.size())
.mapToObj(i -> finalSingleRecord.get(i).equals("") && mergedMap.get(nameList.get(i)) != null ? mergedMap.get(nameList.get(i)).toString() : finalSingleRecord.get(i))
.collect(Collectors.toList());
}
return singleRecord;
}
```
2. 提取一个方法来合并所有规则细节的 Map。
```
private Map<Object, Object> mergeRuleDetails(Set<Map<String, Object>> ruleDtls) {
return ruleDtls.stream()
.flatMap(map -> map.entrySet().stream()
.map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue() == null ? "" : entry.getValue())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue));
}
```
3. 将原来的主方法进行简化,使用上面的两个方法来处理每个实体记录,并将结果添加到 valueList 中。
```
for (Entity e : rsList) {
List<String> singleRecord = processEntity(e, nameList);
valueList.add(singleRecord);
}
```
优化这段代码:List<CompletableFuture<ContactsIntersectionVo>> futureList = intersectionResult.entrySet().stream().map(entry -> CompletableFuture.supplyAsync(() -> { String account = entry.getKey(); List<String> personNoList = entry.getValue().stream().distinct().collect(Collectors.toList()); if (personNoList.size() >= 2) {// 取两个以上的交集 List<Map<String, Object>> remarkList = Lists.newArrayList(); List<PersonBasicVo> personVoList = Lists.newArrayList(); // 获取备注、涉案人 for (String personNo : personNoList) { Map<String, Object> contactsMap = contactsMapList.stream().filter(map -> personNo.equals(map.get("personNo"))).findAny().get(); List<ContactsBasic> contactsList = (List<ContactsBasic>) contactsMap.get("contactsList"); // 获取备注 for (ContactsBasic contacts : contactsList) { if (account.equals(contacts.getRelationshipAccount())) { PersonBasicVo personBasic = personList.stream().filter(person -> personNo.equals(person.getPersonNo())).findAny().get(); Map<String, Object> remarkMap = new HashMap<>(); remarkMap.put("name", personBasic.getName()); remarkMap.put("remark", contacts.getRelationshipName()); remarkList.add(remarkMap); break; } } // 获取涉案人 personVoList.add(personList.stream().filter(person -> personNo.equals(person.getPersonNo())).findAny().get()); } // 共同号码是否属于涉案人 String commonPersonName = getCommonPersonName(personList, account); ContactsIntersectionVo contactsVo = new ContactsIntersectionVo(); contactsVo.setRemarks(remarkList); contactsVo.setPersons(personVoList); contactsVo.setCommonAccount(account); contactsVo.setCommonPersonName(commonPersonName); return contactsVo; } else { return null; } }, executor)).collect(Collectors.toList()); contactisVoList.addAll(futureList.stream().map(CompletableFuture::join) .filter(Objects::nonNull) .collect(Collectors.toList()));
优化后的代码如下:
```java
List<CompletableFuture<ContactsIntersectionVo>> futureList = intersectionResult.entrySet().stream()
.map(entry -> CompletableFuture.supplyAsync(() -> {
String account = entry.getKey();
List<String> personNoList = entry.getValue().stream().distinct().collect(Collectors.toList());
if (personNoList.size() >= 2) {// 取两个以上的交集
List<Map<String, Object>> remarkList = personNoList.stream()
.flatMap(personNo -> {
Map<String, Object> contactsMap = contactsMapList.stream()
.filter(map -> personNo.equals(map.get("personNo")))
.findAny()
.orElseThrow(() -> new NoSuchElementException("Person not found"));
List<ContactsBasic> contactsList = (List<ContactsBasic>) contactsMap.get("contactsList");
PersonBasicVo personBasic = personList.stream()
.filter(person -> personNo.equals(person.getPersonNo()))
.findAny()
.orElseThrow(() -> new NoSuchElementException("Person not found"));
return contactsList.stream()
.filter(contacts -> account.equals(contacts.getRelationshipAccount()))
.flatMap(contacts -> Stream.of(Map.of("name", personBasic.getName(), "remark", contacts.getRelationshipName())));
})
.collect(Collectors.toList());
List<PersonBasicVo> personVoList = personNoList.stream()
.map(personNo -> personList.stream()
.filter(person -> personNo.equals(person.getPersonNo()))
.findAny()
.orElseThrow(() -> new NoSuchElementException("Person not found")))
.collect(Collectors.toList());
String commonPersonName = getCommonPersonName(personList, account);
ContactsIntersectionVo contactsVo = new ContactsIntersectionVo();
contactsVo.setRemarks(remarkList);
contactsVo.setPersons(personVoList);
contactsVo.setCommonAccount(account);
contactsVo.setCommonPersonName(commonPersonName);
return contactsVo;
} else {
return null;
}
}, executor))
.collect(Collectors.toList());
contactisVoList.addAll(futureList.stream()
.map(CompletableFuture::join)
.filter(Objects::nonNull)
.collect(Collectors.toList()));
```
主要优化:
1. 使用流式编程,替换原来的for循环和entrySet遍历。
2. 使用`stream()`和`collect(Collectors.toList())`方法来收集结果,代替手动添加到列表中。
3. 使用`flatMap`方法来处理嵌套的列表。
4. 使用`orElseThrow`方法来处理可能找不到元素的情况,避免空指针异常。
5. 将lambda表达式内联,使代码更简洁。