以下是我想要达到的目标。
"timezones": [
{
"name" : "America/New_York",
"label" : "US Eastern Time"
},
{
"name" : "America/Chicago",
"label" : "US Central Time"
},
{
"name" : "America/Denver",
"label" : "US Mountain Time"
},
{
"name" : "America/Los_Angeles",
"label" : "US Pacific Time"
},
]
下面是我的代码片段
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 (String key : tz.keySet()) {
Timezone timezone = new Timezone();
String value = tz.get(key);
timezone.setName(key);
timezone.setLabel(value);
timezoneList.add(timezone);
}
在这里,我基于keyset迭代map,然后从中获取值,然后创建一个对象并将其添加到列表中。这看起来有很多过程。
有更好的方法吗?
-
如果输入数据以上述JSON字符串的形式提供,则最好实现POJO,然后将该JSON反序列化为列表/数组。
-
如果输入的数据是作为一个映射提供的,那么应该为
Timezone
类实现一个构造器/映射器方法/构建器来转换映射条目:
Map<String,String> tz = Map.of(
"America/New_York", "US Eastern Time",
"America/Chicago", "US Central Time",
"America/Denver", "US Mountain Time",
"America/Los_Angeles", "US Pacific Time"
);
List<Timezone> timezoneList = tz.entrySet()
.stream()
.map(e -> new Timezone(e.getKey(), e.getValue())) // constructor
// .map(e -> new TimezoneBuilder().withName(e.getKey()).withLabel(e.getValue()).build()
.collect(Collectors.toList());
这是一个'现代'的方式,使用流和record
,但你写的很好。
public class SO69307363 {
record TimeZone(String name, String label){};
public static void main(String[] args) {
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> timeZones = tz.entrySet().stream()
.map(e -> new TimeZone(e.getKey(), e.getValue()))
.collect(Collectors.toList());
}
}
我认为这种方式更容易阅读和理解,因为代码更少。
如果您使用Apache commons库,那么这里有一个简单的解决方案。
List<Timezone> collect = CollectionUtils.collect(tz.entrySet().iterator(), entry -> new Timezone(entry.getKey(), entry.getValue()), new ArrayList<>());
如果您更喜欢使用Java-8语法,那么请遵循上面tgdavies提供的答案。
所有答案都是正确的,如果您使用JDK16+,可以直接使用toList()
,并将返回unmodiablelist,
List<Timezone> timezones = tz.entrySet()
.stream()
.map(a -> new Timezone(a.getKey(), a.getValue()))
.toList();