java 聚合函数_如何使用Java流计算两个聚合函数?
我有一个像这样的“请求”对象列表(id,金额,价格)
List requests = Arrays.asList(
new Request(id++, 20, 59.28),
new Request(id++, 10, 61.23),
new Request(id++, 30, 60.67),
new Request(id++, 25, 60.16),
new Request(id++, 60, 59.67));
我想在一次迭代中计算两个指标 – 总和(金额)和总和(金额*价格).我需要它们来计算平均价格:总和(金额*价格)/总和(金额).
考虑到我想使用Java 8流,我发现的唯一变体是将值映射到Pair对象并实现自定义使用者:
static class Aggregate implements Consumer> {
private double count = 0L;
private double sum = 0L;
public double average() {
return count > 0 ? sum/(double) count : 0;
}
public void combine(Aggregate other) {
count += other.count;
sum += other.sum;
}
@Override
public void accept(Pair data) {
this.count += data.getLeft();
this.sum += data.getLeft() * data.getRight();
}
}
Double avgPrice = requests.stream()
.map(e -> Pair.of(e.getAmount(), e.getPrice()))
.collect(Aggregate::new, Aggregate::accept, Aggregate::combine)
.average();
这种方法看起来很混乱 – 我们必须为每个条目创建额外的Pair对象:(
有谁知道更好的解决方案?
最佳答案 当然.您需要自定义聚合,但不需要对:
static class Aggregate {
private long count = 0L;
private double sum = 0L;
double average() { return sum / count; }
void merge(Aggregate other) {
count += other.count;
sum += other.sum;
}
void add(int count, double value) {
this.count += count;
this.sum += count * value;
}
}
}
requests.stream().collect(
Aggregate::new,
(aggr, request) -> aggr.add(request.getCount(), request.getPrice()),
Aggregate::merge)
.average();
而且您实际上并不需要实现Consumer.
老实说,多通道解决方案可能非常快,也更简单……
requests.stream()
.mapToDouble(request -> request.getCount() * request.getPrice())
.sum()
/ requests.stream().mapToLong(Request::getCount).sum();
java 聚合函数_如何使用Java流计算两个聚合函数?相关推荐
- java 求导函数_面向对象编程 —— java实现函数求导
文章目录 首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地.科学地用java求出函数在一点的导数. ★引子 defd(f) :defcalc(x) : d ...
- java有没有求组合的函数_如何在Java 8中使用compose和andThen组合函数
在这篇文章中,课课家将讨论利用java8的Function接口提供的两个组合函数--compose和andThen来实现函数的组合. 什么是函数组合? 首先需要创建一些小的可重用函数,然后将这些小函数 ...
- java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...
面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...
- 00005在java结果输出_浅谈Java反序列化漏洞原理(案例未完善后续补充)
摘要: 0005,这个16进制流基本上也意味者java反序列化的开始:(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果:以上意味着存在Java反序列化,可尝试构造pa ...
- 马士兵 java 学习笔记_马士兵java教程笔记1
---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...
- java闭包矩阵_深刻理解Java闭包概念
闭包又称词法闭包java 闭包最先定义为一种包含和的实体.闭包 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在.函数 解释二:闭包是函数和相关引用环境组成的实体.spa 注: ...
- java for循环_愉快地学Java语言:第五章 循环
导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...
- java 内存空间_怎样用java实现存储空间动态分配
1.java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象 ...
- linux java远程调试_[转]JPDA:Java平台调试架构(常用的远程调试方法)
原文出处:http://www.javaeye.com/topic/75128 最近使用WTP的Server功能很不爽,连tomcat服务器时java类中的任何改动都要重启服务器,一怒之下就改用JPD ...
最新文章
- 论文图片误用?AI:这条路已被我堵死了
- .NET Framework 类库: Uri类
- Waymo冰火两重天:无人出租车最快今秋推出,高管团队嫌隙严重
- 高通董事长:努力降低智能手机价格
- Vue 双向绑定小案例
- 带你自学Python系列(一):变量和简单数据类型(附思维导图)
- html 悬停显示标题,JS实现TITLE悬停长久显示效果完整示例
- 挑战程序设计竞赛(第2版) 第3章笔记
- hadoop2.7的目录结构
- 深入浅出讲解LDA主题模型(一)
- ubuntu postgresql9.5 源码安装
- Java高并发 -- 并发扩展
- SpringBoot+JWT+Shiro,linux 高级编程面试题
- rtmp协议官方规范
- 兰州大学第一届『飞马杯』程序设计竞赛
- DreamweaverCS6 - BUG(2) —— 编辑浏览器列表无法添加浏览器
- OC和Swift语言的区别
- flutter引入高德地图_flutter配置高德地图SDK
- 短学期微机接口课程设计
- 标题创建实体类商品,包含属性:商品名称,商品价格,包含2个属性的构造函数