我有一个像这样的“请求”对象列表(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流计算两个聚合函数?相关推荐

  1. java 求导函数_面向对象编程 —— java实现函数求导

    文章目录 首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地.科学地用java求出函数在一点的导数. ★引子 defd(f) :defcalc(x) : d ...

  2. java有没有求组合的函数_如何在Java 8中使用compose和andThen组合函数

    在这篇文章中,课课家将讨论利用java8的Function接口提供的两个组合函数--compose和andThen来实现函数的组合. 什么是函数组合? 首先需要创建一些小的可重用函数,然后将这些小函数 ...

  3. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...

    面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...

  4. 00005在java结果输出_浅谈Java反序列化漏洞原理(案例未完善后续补充)

    摘要: 0005,这个16进制流基本上也意味者java反序列化的开始:(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果:以上意味着存在Java反序列化,可尝试构造pa ...

  5. 马士兵 java 学习笔记_马士兵java教程笔记1

    ---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...

  6. java闭包矩阵_深刻理解Java闭包概念

    闭包又称词法闭包java 闭包最先定义为一种包含和的实体.闭包 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在.函数 解释二:闭包是函数和相关引用环境组成的实体.spa 注: ...

  7. java for循环_愉快地学Java语言:第五章 循环

    导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...

  8. java 内存空间_怎样用java实现存储空间动态分配

    1.java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象 ...

  9. linux java远程调试_[转]JPDA:Java平台调试架构(常用的远程调试方法)

    原文出处:http://www.javaeye.com/topic/75128 最近使用WTP的Server功能很不爽,连tomcat服务器时java类中的任何改动都要重启服务器,一怒之下就改用JPD ...

最新文章

  1. 论文图片误用?AI:这条路已被我堵死了
  2. .NET Framework 类库: Uri类
  3. Waymo冰火两重天:无人出租车最快今秋推出,高管团队嫌隙严重
  4. 高通董事长:努力降低智能手机价格
  5. Vue 双向绑定小案例
  6. 带你自学Python系列(一):变量和简单数据类型(附思维导图)
  7. html 悬停显示标题,JS实现TITLE悬停长久显示效果完整示例
  8. 挑战程序设计竞赛(第2版) 第3章笔记
  9. hadoop2.7的目录结构
  10. 深入浅出讲解LDA主题模型(一)
  11. ubuntu postgresql9.5 源码安装
  12. Java高并发 -- 并发扩展
  13. SpringBoot+JWT+Shiro,linux 高级编程面试题
  14. rtmp协议官方规范
  15. 兰州大学第一届『飞马杯』程序设计竞赛
  16. DreamweaverCS6 - BUG(2) —— 编辑浏览器列表无法添加浏览器
  17. OC和Swift语言的区别
  18. flutter引入高德地图_flutter配置高德地图SDK
  19. 短学期微机接口课程设计
  20. 标题创建实体类商品,包含属性:商品名称,商品价格,包含2个属性的构造函数

热门文章

  1. 什么是气泡图?怎样用Python绘制?怎么用?终于有人讲明白了
  2. 世界杯29场点球大战的269个点球数据都在这里!霍金的公式帮了英格兰吗?
  3. php中的strncmp,PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
  4. 一个HTTP请求,把网站打裂开了!
  5. PHP 是最糟糕编程语言?
  6. 一文领略 HTTP 的前世今生
  7. 文言文能编程了,是噱头还是突破?
  8. 浅谈JSP自定义标签实现过程
  9. 数据源管理 | Kafka集群环境搭建,消息存储机制详解
  10. Linux系统:常用Linux系统管理命令总结