lambda复制具有不同键类型的映射

问题描述 投票:2回答:1

我们有一个Map<String,MyObject>,需要将其转换为Map<Date, MyObject>。这里的字符串不过是日期存储为字符串,即

{"1999-11-07T18:30:00.000+0000":{"property1":"value1","property2":valuep1},
{"1998-11-07T18:30:00.000+0000":{"property1":"value2","property2":valuep2}

是否有使用lambda和stream的简便方法?我们正在使用java8和Jackson API。

java lambda java-8
1个回答
2
投票
yourMap.entrySet().stream()
                        .collect(Collectors.toMap(
                                this::parseDate,
                                Map.Entry::getValue
                        ));

创建一个将字符串解析为日期的方法;

private Date parseDate(Map.Entry<String, Object> e) {
        try {
            return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(e.getKey());
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return some date;
    }

0
投票

由于正在使用java8,因此可以考虑使用LocalDate代替java.util.Date。获取现有地图的条目集,并使用LocalDate收集器以toMap作为键,并以MyObject作为值创建一个新地图。这是它的外观。

Map<LocalDate, MyObject> myObjByDate = map.entrySet().stream()
    .collect(Collectors.toMap(e -> LocalDate.parse(e.getKey().split("T")[0]), Map.Entry::getValue));
© www.soinside.com 2019 - 2024. All rights reserved.