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}}