首页 / JAVA / Java 8,复杂分组按时间间隔
Java 8,复杂分组按时间间隔
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 8,复杂分组按时间间隔,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1669字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试进行一些数据分析,并将结果输出到XY图表.
我的图表本身已经平方,它接受的结构如下:
ObservableList<Data<Timestamp, BigDecimal>>
我的数据存储在一个自定义对象中,就像这样
public class funds{
private long id;
private String userName;
private BigDecimal current;
private Timestamp createdAt;
....constructors/getters/setters....
}
每隔1分钟执行一次周期性任务,为每个用户创建一个资金对象.
我想绘制所有资金的当前平均小时数.
因此,我通常会总结所有用户的每分钟信息,然后每小时平均.在MySQL中,我可以这样做:
SELECT FLOOR(UNIX_TIMESTAMP(created_at)/(60*60)) AS hour, AVG(current)
FROM (
SELECT FLOOR(UNIX_TIMESTAMP(created_at)/60) AS minute, SUM(current) as current, created_at
FROM funds
GROUP BY minute
) as table1
GROUP BY hour;
但是在这种情况下,我没有直接的SQL访问权限,必须使用Java.我曾尝试查看流和Collectors.groupingBy,但是我无法将其包裹在头上以至于无法获得所需的内容.
另外,收集器似乎没有与BigDecimal一起使用的任何功能,这是我需要的,因为对财务数据而言,双精度数据非常糟糕.
谁能指出我正确的方向?
解决方法:
如果您真的不想使用双打,请尝试以下操作:
Map<Long, BigDecimal> hourAverages = funds.stream()
//group by minute; as a result we have Map<Long, BigDecimal>
.collect(toMap(f -> f.createdAt.getTime() / 6000, f -> f.current, BigDecimal::add))
.entrySet().stream()
//group by hours; here we use BigDecimal[] to store sum and count;
//as a result we have Map<Long, BigDecimal[]>
.collect(groupingBy(e -> e.getKey() / 60,
collectingAndThen(
reducing(new BigDecimal[] {BigDecimal.ZERO, BigDecimal.ZERO},
e -> new BigDecimal[]{e.getValue(), BigDecimal.ONE},
(a, b) -> new BigDecimal[]{a[0].add(b[0]), a[1].add(b[1])}),
//finally divide by count
a -> a[0].divide(a[1], BigDecimal.ROUND_UP))));
内容总结
以上是互联网集市为您收集整理的Java 8,复杂分组按时间间隔全部内容,希望文章能够帮你解决Java 8,复杂分组按时间间隔所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。