这段代码该怎么优化 Optional<Map<String, Object>> stringObjectMapOpt = Optional.ofNullable(result.get(0)); Map<String, Object> stringObjectMap = stringObjectMapOpt.orElse(new HashMap<>()); ReadArticleRuleDTO articleRuleDTO = getReadArticleRuleDTO(); articleRuleDTO.setReadingArticleDuration(Long.parseLong((String) stringObjectMap.getOrDefault(READING_ARTICLE_DURATION.getValue(), "0"))); articleRuleDTO.setCompleteTaskMaxReadCount(Integer.parseInt((String) stringObjectMap.getOrDefault(READING_ARTICLE_COUNT_MAX.getValue(), "0"))); articleRuleDTO.setCompleteCountPlatformShared(Boolean.parseBoolean((String) stringObjectMap.getOrDefault(READING_ARTICLE_PLATFORM_SHARED.getValue(), "false")) ? CommonBusinessEnum.YesNoEnum.YES.getValue() : CommonBusinessEnum.YesNoEnum.NO.getValue()); articleRuleDTO.setRepeatRewards(Boolean.parseBoolean((String) stringObjectMap.getOrDefault(REPEAT_REWARDS.getValue(), "false")) ? CommonBusinessEnum.YesNoEnum.YES.getValue() : CommonBusinessEnum.YesNoEnum.NO.getValue()); articleRuleDTO.setCompleteTaskMaxCountOnDay(Integer.parseInt((String) stringObjectMap.getOrDefault(DAY_COMPLETE_TASK_MAX.getValue(), "0"))); Optional<Object> optionalAwardDetail = Optional.ofNullable(stringObjectMap.get("awardDetail")); articleRuleDTO.setAwardDetails(optionalAwardDetail.map(ad -> (List<AwardDetails>) ad).orElse(new ArrayList<>())); articleRuleDTO.setTaskCode(taskCode); detailDTO.setArticleRuleDTO(articleRuleDTO); detailDTO.setDataList(new ArrayList<>());
时间: 2023-02-07 08:46:05 浏览: 162
你可以考虑用下面的方法来优化这段代码:
1. 把多个 `Boolean.parseBoolean((String) stringObjectMap.getOrDefault(key, "false"))` 和 `Integer.parseInt((String) stringObjectMap.getOrDefault(key, "0"))` 的判断和转换放到一个函数里面,减少重复的代码。
2. 对于 `Optional<Object> optionalAwardDetail`,可以把它转换成一个函数,然后通过把参数类型指定为 `Optional<AwardDetails>` 来简化代码。
3. 你可以考虑将 `ReadArticleRuleDTO` 中的字段设置为静态 final 类型,这样就可以避免每次创建新的 `ReadArticleRuleDTO` 对象。
4. 你可以把 `stringObjectMap.getOrDefault(key, defaultValue)` 替换成 `stringObjectMap.get(key)`,如果为 `null` 就使用默认值。这样可以减少一些不必要的转换和判断。
5. 对于 `Map<String, Object> stringObjectMap`,如果你确定它一定不为 `null`,你可以使用 `Map.of()` 或 `Map.ofEntries()` 来创建,这样可以避免使用 `Optional`。
相关问题
Java Map<List<Map<String, Object>>>类型数据,每个key的value只保留一条,然后转成List<Map<String, Object>>
如果你有一个`Map<List<Map<String, Object>>>`的数据结构,其中每个Key对应一个子列表,你想移除每个子列表中重复的元素并将其转换为新的`List<Map<String, Object>>`,可以按照以下步骤操作:
1. 遍历外部的Map,对于每个子列表:
- 使用Java Stream的`distinct()`方法去除重复项,因为`List<Map<String, Object>>`本身是有序的,所以默认的`distinct()`就足够了,它会基于`equals()`和`hashCode()`进行比较,确保唯一性。
- 将去重后的子列表作为一个单独的对象存储起来,例如`Optional<Map<String, Object>>`,这可以避免创建新的Map实例,直到真正需要时才构造。
```java
Map<String, List<Map<String, Object>>> originalMap = ...;
Map<String, Optional<Map<String, Object>>> deduplicatedMap = originalMap.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> {
List<Map<String, Object>> value = entry.getValue();
return value.stream()
.distinct()
.findFirst(); // 返回第一个非重复元素,或者Optional.empty()如果没有重复
},
(prev, next) -> prev // 后面的映射覆盖前面的,这里不需要合并
));
```
2. 将`Optional<Map<String, Object>>`转换回`List<Map<String, Object>>`:
可以使用`Stream.concat()`和`orElseGet()`来完成,或者直接过滤掉`Optional.empty()`:
```java
List<Map<String, Object>> finalResult = deduplicatedMap.values().stream()
.map(Optional::get) // 或者.map(Map::orElseThrow(() -> new IllegalStateException("No unique element found")))
.collect(Collectors.toList());
```
这里的`.orElseGet(() -> ...)`提供了默认值,当`Optional`是空的时候,会执行给定的函数获取默认值,这里是抛出异常。
最终的`finalResult`就是一个不含重复项的新列表,其中每个Key对应的value都是唯一的。
如何从下面这段代码中获取到map中的另一个值 // 获取任务规则明细的第一条记录的 Optional 对象 Optional<Map<String, Object>> mapOptional = getResult(taskRuleDetailsOptional.get()).stream().findFirst(); // 如果任务规则明细的第一条记录的 "reading_article_platform_shared" 字段不是 "1",则将 appCode 添加到已完成任务数量的键名中 if (mapOptional.map(map -> map.get("reading_article_platform_shared")) .map(o -> !"1".equals(o)).orElse(false)) { readCountKey += ":" + taskDTO.getAppCode(); }
如果要获取 map 中的另一个值,可以使用 map 方法,如下所示:
mapOptional.map(map -> map.get("另一个值的键名"))
如果要获取 map 中的多个值,可以把 map 方法放在多个 .map() 方法的链中,例如:
mapOptional.map(map -> map.get("键名1")).map(value1 -> map.get("键名2")).map(value2 -> ……)
在上面的代码中,要获取 map 中的 "reading_article_platform_shared" 字段,可以使用如下代码:
mapOptional.map(map -> map.get("reading_article_platform_shared"))
如果要获取 map 中的多个字段,可以使用如下代码:
mapOptional.map(map -> map.get("键名1")).map(value1 -> map.get("键名2")).map(value2 -> ……)
注意:在使用 .map() 方法时,应该根据 map 中的值的数据类型来选择合适的转换方法。例如,如果 map 中的值是字符串,则可以使用 .map(String::valueOf) 来转换为字符串。
阅读全文
相关推荐




