如何简洁实现Java中Map<String,String>到自定义对象List的转换
Map<String,String>转Timezone对象列表的优化实现
方案1:EntrySet遍历(Java 8之前版本适用)
原实现遍历keySet后再调用get(key)取对应值,会多执行一次哈希查询操作,直接遍历entrySet可以一次性拿到键值对,性能更优:
Map<String,String> tz = new HashMap<>(); tz.put("America/New_York", "US Eastern Time"); tz.put("America/Chicago", "US Central Time"); tz.put("America/Denver", "US Mountain Time"); tz.put("America/Los_Angeles", "US Pacific Time"); List<Timezone> timezoneList = new ArrayList<>(); for (Map.Entry<String, String> entry : tz.entrySet()) { Timezone timezone = new Timezone(); timezone.setName(entry.getKey()); timezone.setLabel(entry.getValue()); timezoneList.add(timezone); }
方案2:Stream API实现(Java 8及以上版本推荐,代码更简洁)
用流式写法省去手动初始化列表、添加元素的样板代码,逻辑更直观:
// 无全参构造时的写法 List<Timezone> timezoneList = tz.entrySet().stream() .map(entry -> { Timezone timezone = new Timezone(); timezone.setName(entry.getKey()); timezone.setLabel(entry.getValue()); return timezone; }) // Java 16+ 可直接用toList(),Java 8-15版本替换为.collect(Collectors.toList()) .toList();
如果你的Timezone类提供了包含name、label两个参数的构造方法(可以用Lombok的@AllArgsConstructor注解快速生成),写法可以进一步简化:
List<Timezone> timezoneList = tz.entrySet().stream() .map(entry -> new Timezone(entry.getKey(), entry.getValue())) .toList();
两种优化方案的最终输出都和你要求的结构完全一致,Stream写法和普通循环的性能差异在业务场景下几乎可以忽略,更推荐用更简洁的流式写法。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

