在java8流中使用分组

时间:2017-03-08 12:16:51

标签: java json java-8 java-stream

我有一个我希望转换为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"}]
    }

但如果我不把它放在对象中,我就不能对它进行分组。 是否有任何解决方法可以实现它?

2 个答案:

答案 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;
        }
    ));