如何将Java对象中驼峰格式的值转换为蛇形格式且保留原有结构
错误原因说明
- 第一个方案无效果是因为Java中
String是不可变类,CaseFormat.LOWER_CAMEL.to()会返回新的字符串对象,你仅对遍历出的字符串做了转换,但没有把转换后的结果写回原列表,原有列表的元素不会发生变化。 - 第二个方案结构错误是因为你使用了
flatMap操作,该操作会把所有内层List的元素全部打散合并到同一个外层List中,自然就把双层嵌套结构压平为单层了。
正确实现方案
这里提供两种可靠实现,均会完全保留原有双层嵌套结构:
方案1:直接修改原有列表
如果你不需要保留原始数据,直接修改原列表即可:
Map<String, Object> myLayout = (Map<String, Object>) data.getMyLayout(); List<List<String>> titles = (List<List<String>>) myLayout.get("titles"); titles.forEach(titleList -> { for (int i = 0; i < titleList.size(); i++) { String convertedStr = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, titleList.get(i)); titleList.set(i, convertedStr); } });
方案2:Stream生成新列表替换
写法更简洁,生成新的双层列表替换原有值:
Map<String, Object> myLayout = (Map<String, Object>) data.getMyLayout(); List<List<String>> titles = (List<List<String>>) myLayout.get("titles"); List<List<String>> updatedTitles = titles.stream() .map(titleList -> titleList.stream() .map(title -> CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, title)) .collect(Collectors.toList()) ) .collect(Collectors.toList()); myLayout.put("titles", updatedTitles);
以上两种方案执行后,输出的结构和值都会符合你的预期。
内容的提问来源于stack exchange,提问作者stacky
相关产品推荐
相关产品推荐

