我有一个我希望转换为JSON的事件对象列表。
事件定义如下:
public class Event {
private final String name;
private final Date date;
public Event(String name, Date date) {
this.name = name;
this.date = date;
}
public String getName() {
return name;
}
public Date getDate() {
return date;
}
}
以下代码:
List<Event> events = ...;
SimpleDateFormat dayFormatter=new SimpleDateFormat("dd/MM/yyyy");
Map<String,List<JsonNode>> result = events.stream().map(event -> {
ObjectNode jsonMatch = jsonNodeFactory.objectNode();
jsonMatch.put("name",event.getName());
jsonMatch.put("day",dayFormatter.format(event.getDate()));
return jsonMatch;
}).collect(Collectors.groupingBy(item -> item.get("day").asText(),
Collectors.toList()));
为我创建了一个我想要的json,看起来像这样:
{
"10/03/2014": [{name:"event1",day:"10/03/2014"},{name:"event2",day:"10/03/2014"}]
}
但是对我来说,每个事件节点中的day属性是我想要绕过的冗余信息,以便获得这个json:
{
"10/03/2014": [{name:"event1"},{name:"event2"}]
}
但如果我不把它放在对象中,我就不能对它进行分组。 是否有任何解决方法可以实现它?
答案 0 :(得分:2)
请勿在{{1}}操作之前执行映射步骤,仅针对组的值执行此操作。
collect
答案 1 :(得分:0)
您可以使用Collectors.toMap()
方法:
Map<String,List<JsonNode>> result = events.stream()
.map(event -> {
ObjectNode jsonMatch = jsonNodeFactory.objectNode();
jsonMatch.put("name",event.getName());
jsonMatch.put("day",dayFormatter.format(event.getDate()));
return jsonMatch;
})
.collect(Collectors.toMap(
item -> item.get("day").asText(),
item -> new ArrayList<>(Arrays.asList(item.get("name"))),
(i1, i2) -> {
i1.addAll(i2);
return i1;
}
));