Java 8 Java8收集并更改结果的格式

Java 8 Java8收集并更改结果的格式,java-8,java-stream,Java 8,Java Stream,我有一个名为MyPojo的数据结构,其中包含名为time、name和timetake的字段(都是字符串)。我尝试进行如下分组: List<MyPojo> myPojos = Arrays.asList( new MyPojo("2017", "ABC", "30"), new MyPojo("2017", "ABC", "20"), new MyPojo("2016", "ABC", "25"), new MyP

我有一个名为
MyPojo
的数据结构,其中包含名为
time
name
timetake
的字段(都是字符串)。我尝试进行如下分组:

    List<MyPojo> myPojos = Arrays.asList(
        new MyPojo("2017", "ABC", "30"),
        new MyPojo("2017", "ABC", "20"),
        new MyPojo("2016", "ABC", "25"),
        new MyPojo("2017", "XYZ", "40")
    );

    Map<String, Map<String, Double>> resultMap = myPojos.stream()
        .collect(Collectors.groupingBy(MyPojo::getName,
            Collectors.groupingBy(MyPojo::getTime,
                Collectors.averagingDouble(MyPojo::getTimeTakenAsDouble))));
    {ABC={2017=25.0, 2016=25.0}, XYZ={2017=40.0}}
但是,我的前端开发人员希望数据采用以下格式:

    {ABC={2017=25.0, 2016=25.0}, XYZ={2017=40.0, 2016=0.0}}


我正在考虑对
resultMap
执行迭代,并准备第二种格式。我正试图在
resultMap
上再次执行迭代。有没有其他方法来处理这个问题?

实际上,你想要实现的目标非常有趣。这就像你在尝试做某种逻辑上的填充。我这样做的方法是使用
收集器。CollectingAnd然后
。一旦结果出现了,我就用所需的数据填充它

请注意,我使用的是
set.difference
,它来自
guava
,但是可以很容易地将其放入静态方法中。此外,还执行了其他操作

因此,我假设您的
MyPojo
如下所示:

 static class MyPojo {

    private final String time;

    private final String name;

    private final String timetaken;

    public MyPojo(String time, String name, String timetaken) {
        super();
        this.name = name;
        this.time = time;
        this.timetaken = timetaken;
    }

    public String getName() {
        return name;
    }

    public String getTime() {
        return time;
    }

    public String getTimetaken() {
        return timetaken;
    }

    public static double getTimeTakenAsDouble(MyPojo pojo) {
        return Double.parseDouble(pojo.getTimetaken());
    }
}
我检查的输入数据是:

 List<MyPojo> myPojos = Arrays.asList(
            new MyPojo("2017", "ABC", "30"),
            new MyPojo("2017", "ABC", "20"),
            new MyPojo("2016", "ABC", "25"),
            new MyPojo("2017", "XYZ", "40"),
            new MyPojo("2018", "RDF", "80"));

什么是
distinctYears
这里?@VimalrajSelvam我的错。刚刚补充说,这是一个很好的方法。虽然当我需要这样做的时候,我已经反过来做了:我首先创建了一个映射,并为每个可能的组填充了所有的零条目,然后使用一个收集器(或者
groupingBy
或者
toMap
)和一个自定义映射供应商
()->mymapWithzero
)。
 List<MyPojo> myPojos = Arrays.asList(
            new MyPojo("2017", "ABC", "30"),
            new MyPojo("2017", "ABC", "20"),
            new MyPojo("2016", "ABC", "25"),
            new MyPojo("2017", "XYZ", "40"),
            new MyPojo("2018", "RDF", "80"));
 Set<String> distinctYears = myPojos.stream().map(MyPojo::getTime).collect(Collectors.toSet());

 Map<String, Map<String, Double>> resultMap = myPojos.stream()
            .collect(Collectors.groupingBy(MyPojo::getName,
                    Collectors.collectingAndThen(
                            Collectors.groupingBy(MyPojo::getTime,
                                    Collectors.averagingDouble(MyPojo::getTimeTakenAsDouble)),
                            map -> {
                                Set<String> localYears = map.keySet();
                                SetView<String> diff = Sets.difference(distinctYears, localYears);
                                Map<String, Double> toReturn = new HashMap<>(localYears.size() + diff.size());
                                toReturn.putAll(map);
                                diff.stream().forEach(e -> toReturn.put(e, 0.0));
                                return toReturn;
                            }
                    )));
{ABC={2016=25.0, 2018=0.0, 2017=25.0}, 
 RDF={2016=0.0, 2018=80.0, 2017=0.0}, 
 XYZ={2016=0.0, 2018=0.0, 2017=40.0}}