首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java:如何使用表达式语言方法聚合集合元素属性(min、max、avg)?

Java:如何使用表达式语言方法聚合集合元素属性(min、max、avg)?
EN

Stack Overflow用户
提问于 2012-07-07 04:16:44
回答 2查看 2.5K关注 0票数 4

我正在寻找一种在Java集合上进行聚合功能的简单方法,以确定产品集合的最低价格。但是我不想用纯java语言,而是某种DSL /脚本/表达式语言,它可以由用户输入,因此需要尽可能简单。

假设我有以下对象结构:

代码语言:javascript
运行
AI代码解释
复制
Product:
id: product1
offers: [offer1, offer2]


Offer1:
id: offer1
data:
  price: 10.99
  shipCost: 3.99

Offer2:
id: offer2
data:
  price: 5.99
  shipCost: 3.99

在上面的示例中,最终结果如下所示:

代码语言:javascript
运行
AI代码解释
复制
minPriceOfProduct1 = 5.99

现在,我的应用程序的用户可以显示产品列表。对于每一种产品,他都想得到最低的价格,这是所有报价中的最低价格。用户没有对底层数据存储的访问权限,因此SQL不是选项。我们唯一拥有的就是java对象。我希望用户使用某种表达式语言来导出这一点。

目前,我有能力将Freemarker代码片段应用到每个产品中,以获取数据,或者做更多的工作来根据以下属性计算新值:

代码语言:javascript
运行
AI代码解释
复制
<#if (item.isProduct() && item.offers??) >
   <#assign offerMinPrice = -1>
   <#list item.offers as o>
     <#if (offerMinPrice == -1 || ( o.data.priceCents?? && o.data.priceCents < offerMinPrice ) )>
       <#assign offerMinPrice=o.data.priceCents! >
     </#if> 
   </#list> 

   <#if offerMinPrice != -1>
       ${offerMinPrice}
   <#else>
       ${priceCents}
   </#if> 
<#else>
   ${priceCents!}
</#if>

这是可行的,但它是丑陋的代码,这不仅使我的大脑出血。我更希望有一种更简单的表达语言方法,它可以是这样的:

代码语言:javascript
运行
AI代码解释
复制
minOffersPrice = min(product.offers.data.price)

对于用户来说,这看起来要简单得多,并且应该在幕后完成同样的聚合。

你想到了什么方法?从网络搜索中,我想到了以下几点:

谢谢克里斯多夫

EN

回答 2

Stack Overflow用户

发布于 2013-04-21 04:15:57

LambdaJ是一个使用普通Java:https://code.google.com/p/lambdaj/wiki/LambdajFeatures来解决这个问题的库。

代码语言:javascript
运行
AI代码解释
复制
Person maxAgePerson = selectMax(personsList, on(Person.class).getAge() );

其中selectMaxon是来自兰卜达类的静态导入。

票数 3
EN

Stack Overflow用户

发布于 2014-10-11 06:48:45

Java 8流以相当流畅的语法提供了其中一些功能:

代码语言:javascript
运行
AI代码解释
复制
import static java.util.Comparator.comparingBy;
/* ... */
BigDecimal minPrice = product1.offers.stream()
    .min(comparingBy(o -> o.data.price));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11374922

复制
相关文章
MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy
众所周知,MybatisPlus在处理单表DAO操作时非常的方便。在处理多表连接连接查询也有优雅的解决方案。今天分享MybatisPlus基于Lambda表达式优雅实现聚合分组查询。
赛先生和泰先生
2022/11/07
6.9K0
MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy
Hive窗口函数01-SUM、MIN、MAX、AVG
order by : 在同一个组内,先累加完相同createtime的pv,再累加其他createtime的pv, 比如 : 现在在表末尾加一条数据cookie1 2015-04-10 1 1,那么结果就是 :
CoderJed
2018/09/13
2.8K0
Oracle分析函数三——SUM,AVG,MIN,MAX,COUNT
功能描述:对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。
python与大数据分析
2022/03/11
5950
Oracle分析函数三——SUM,AVG,MIN,MAX,COUNT
SQL聚合函数 AVG
AVG返回NUMERIC或DOUBLE数据类型。 如果expression是DOUBLE类型,AVG返回DOUBLE; 否则,它返回NUMERIC。
用户7741497
2022/03/27
3.3K1
【说站】javascript max和min的使用
以上就是javascript max和min的使用,希望对大家有所帮助。更多Javascript学习指路:Javascript
很酷的站长
2022/11/24
6340
【说站】javascript max和min的使用
Java8 | 如何使用Group By 聚合操作集合数据?
集合数据分组很多在实际开发过程中是相当常见,比如传给前端的产品数据按照类型进行分组。最常见的方式是遍历整个集合,然后通过判断类型构造存储不同类型的集合。那么有没有更好的办法,Java8 groupingBy能帮到我们。
玖柒的小窝
2021/11/28
1.7K0
SQL聚合函数 MIN
MIN聚合函数返回表达式的最小值(最小值)。通常,表达式是查询返回的多行中的字段名称(或包含一个或多个字段名称的表达式)。
用户7741497
2022/03/27
1.3K0
集合去重 (集合元素为引用类型)--- java 8 新特性 --- 根据元素单属性、多属性实现去重
1. 代码写法: (要求 JDK 1.8 或 1.8 以上) package gentle.entity; import lombok.Data; /** * * @author silence * @date 2018/7/6 10:58 */ @Data // 此注解可自动生成set/get、自动重写equals/hashcode 等,不用在代码中书写相关代码。 public class User { private String name; private int a
微风-- 轻许--
2022/04/13
6290
集合去重 (集合元素为引用类型)--- java 8 新特性 --- 根据元素单属性、多属性实现去重
CSS之关于min-width、max-width、min-height和max-height的使用
设div父盒子A中有个div子盒子B,设B的min-height为H,则H为盒子B的最小高度值,意思是:
xinxin-l
2022/03/29
1.4K0
CSS之关于min-width、max-width、min-height和max-height的使用
C语言 | 选择1或2输出max或min
例36:C语言实现输入两个整数,然后让用户选择1或者2,选择1是调用max,输出两者中的大数,选择2是调用min,输出两者中的小数。
小林C语言
2020/12/16
1.2K0
C语言 | 选择1或2输出max或min
Pytorch的max()与min()函数
函数定义:torch.max(input, dim, max=None, max_indices=None,keepdim=False)
狼啸风云
2020/05/07
7.1K0
SQL聚合函数 MAX
MAX聚合函数返回表达式的最大值。 通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。
用户7741497
2022/03/27
1.2K0
集合:按元素的中文属性排序
1. 要排序的元素类: public static class NameCount implements Comparable<NameCount> { Collator collator = Collator.getInstance(java.util.Locale.CHINA); @ApiModelProperty(value = "名") private String name; @ApiModelProperty(value =
微风-- 轻许--
2020/04/14
1.4K0
MySQL中min和max查询优化
测试版本:Server version:        5.1.58-log MySQL Community Server (GPL)
星哥玩云
2022/08/17
1.3K0
JAVA 集合list,Map删除元素的方法总结
这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。
traffic
2020/04/09
2.9K0
MADlib——基于SQL的数据挖掘解决方案(26)——聚类之k-means方法
聚类算法大都是几种最基本的方法,如k-means、层次聚类、SOM等,以及它们的许多改进变种。MADlib提供了一种k-means算法的实现。本篇主要介绍MADlib的k-means算法相关函数和应用案例。
用户1148526
2019/05/25
8360
Hibernate对象导航语言
文章目录 1. HQL - 对象导航语言 1.1. 简介 1.2. 步骤 1.3. 准备 1.4. 实体查询 1.4.1. 格式 1.4.2. 拓展 1.4.3. 实例 1.5. 部分字段的查询 1.5.1. 格式 1.5.2. 实例 1.6. 多表联合查询 1.7. 前提 1.7.1. 常见的联合查询方式 1.7.2. 对象方式关联查询 1.7.2.1. 实例 1.7.3. join方式查询 1.7.3.1. 左外连查询 1.7.3.1.1. 格式 1.7.3.1.2. 实例 1.7.3.2. 右外连
爱撒谎的男孩
2019/12/31
9050
Max-Min Fairness带宽分配算法
最近再写一个网络仿真器,里面参考了Max-MinFairness算法,这是一种比较理想、公平的带宽分配算法。其思路主要如下:首先是算法的准备,考察某一时刻的网络中所有的flow,由于每条flow都有其各个link,因此可以得到各个link上所有流经的flow,然后开始迭代,各个link都把capacity平均分给所有流经的flow,接着每条flow的速度就等于其最小link分配的带宽,然后每条link的剩余带宽就等于link的capacity减去所有流经的flow的速度的总和,再然后把link的剩余带宽作为
forrestlin
2018/05/23
1.9K0
min-width 属性
min-widht 规定设置最小宽度,且能阻止 height 属性的设置值比 min-width 小。
Html5知典
2019/11/26
8120
min-height 属性
min-height 规定标签设置最小高度,且能阻止height属性的设置值比min-height小。min-height 可覆盖 height , min-height 可覆盖 max-height。
Html5知典
2019/11/26
1.2K0

相似问题

Server查询- Min、Max、Avg聚合问题

14

如何在java上做Groupby,Sum,Avg,Min,Max集合?

10

在南迁移中使用聚合器(Min、Max、Avg)

10

如何使用sqlbuilder.smartsql使用聚合函数(avg、count、max、min)

14

如何模拟聚合函数avg,sum,max,min,和PouchDB?

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文