我有这个代码:
Map<List<Object>, Long> collector = root.getReports().stream().collect(
Collectors.groupingBy(r -> Arrays.asList(i.X(), i.Y(), i.Z(), i.A()), Collectors.counting()));
for(Entry<Object, Long> entry : collector.entrySet())
System.out.println(String.format("%s = %s", entry.getKey(), entry.getValue()));
基本上会产生以下结果:
[16292, 141, 6, 100] = 2
[16288, 250, 59, 500] = 14
[16286, 250, 91, 50] = 4
[16287, 250, 91, 60] = 29
[16286, 250, 91, 80] = 10
[16293, 141, 6, 100] = 3
[16282, 079, 116, 50] = 9
...
我需要将此结果放入一个自定义类中:
@EqualsAndHashCode @ToString
public class CustomReport implements Serializable {
private static final long serialVersionUID = 2074900904056768029L;
@Getter @Setter
private Integer x, y, z;
@Getter @Setter
private String a;
@Getter @Setter
private Long result;
}
有没有一种方法可以不遍历所有列表并手动进行?
不确定这是否是您想要的。但是,您可以Map<CustomReport, Long>
直接获得a 而不是先创建a Map<List<Object>, Long>
,然后通过它来将那些对象转换为目标类。
前提是CustomReport
必须实现equals()
[ 1 ]和hashCode()
[ 2 ]
然后,您可以执行以下操作:
root.getReports().stream().collect(
Collectors.groupingBy(i -> new CustomReport(i.X(), i.Y(), i.Z(), i.A()),
HashMap::new,
Collectors.counting()));
我假设CustomReport
也有兼容的构造函数。如果必须使用setter进行初始化,则可以将分类器的第一个参数替换为:
i -> {
CustomReport c = new CustomReport();
c.setX(i.X());
...
return c;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句