stream流计算bigdecimal和
时间: 2023-07-14 14:07:38 浏览: 94
stream流计算中可以使用BigDecimal和Double类型进行数值计算。但是在涉及到精度和精确度要求较高的场景下,建议使用BigDecimal类型进行计算。因为BigDecimal类型可以精确表示任意大小和精度的浮点数,而Double类型则存在精度损失的问题。在使用BigDecimal类型进行计算时,需要注意保留位数和舍入方式的设置,以确保计算结果的准确性。
相关问题
stream流处理BigDecimal
使用stream流处理BigDecimal的方法有几种常规计算方式。首先,可以使用distinct()和count()方法来统计去重计数。例如,对一个对象列表进行去重计数可以使用以下代码:
list.stream().filter(o -> o.getName() != null).map(object::getName).distinct().count();
另外一种常见的方式是使用reduce()方法进行累加。对一个对象列表中的某个字段进行累加可以使用以下代码:
list.stream().filter(o -> o.getElecutionTime() != null).map(object::getElecutionTime).reduce(BigDecimal.ZERO, BigDecimal::add);
如果返回值是int类型,可以直接使用sum()方法进行求和。例如,对一个学生对象列表中的某个字段进行求和可以使用以下代码:
list.stream().filter(o -> o.getCount() != null).mapToInt(Student::getCount).sum();
还可以使用max()方法来取最大值。例如,对一个对象列表中的某个字段取最大值可以使用以下代码:
list.stream().filter(o -> o.getMaxPeakLoad() != null).map(Object::getMaxPeakLoad).max(BigDecimal::compareTo).orElse(new BigDecimal("0"));
此外,还可以使用filter()方法进行简单的过滤,然后使用findFirst()方法找到第一个匹配的对象。例如,从一个对象列表中找到某个字段值与指定值相等的对象,并获取其结束日期可以使用以下代码:
orgOneEvaluations.stream().filter(item -> maxLoad.equals(item.getMaxPeakLoad())).findFirst().orElse(new OrgOneEvaluation()).getEndDate();
另外,还可以通过使用反射技术将实体类转换成map的方式进行处理。这种方法可以将对象的字段名作为key,字段值作为value放入map中。例如,可以使用以下代码将一个对象转换成map:
private static Map<String, BigDecimal> objectToMap(Object obj) {
Map<String, BigDecimal> map = new HashMap<>();
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
if (field.get(obj) != null) {
map.put(field.getName(), (BigDecimal) field.get(obj));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
} [2,3]
注意,以上代码中的BigDecimal类型对null值不友好,如果需要保留null值,则可以去除判空逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [map集合-stream流-BigDecimal](https://blog.csdn.net/weixin_44696435/article/details/126008713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
stream流计算集合中BigDecimal类型的字段的总和
要计算集合中BigDecimal类型字段的总和,可以使用stream流和reduce方法。首先,将集合转换为流,然后使用map方法将每个对象的BigDecimal字段提取出来。接下来,使用reduce方法将所有的BigDecimal值相加起来。下面是一个示例代码:
```java
BigDecimal sum = list.stream()
.map(MyClass::getBigDecimalField)
.reduce(BigDecimal.ZERO, BigDecimal::add);
```
在这个示例中,假设集合的元素类型为MyClass,其中包含一个名为getBigDecimalField的方法,用于获取BigDecimal类型的字段值。reduce方法的第一个参数是初始值,这里使用BigDecimal.ZERO表示初始值为0。第二个参数是一个BinaryOperator,用于将两个BigDecimal值相加。
请注意,你需要根据实际情况将示例代码中的MyClass替换为你的实体类名称,getBigDecimalField替换为你的实体类中获取BigDecimal字段值的方法名称。
#### 引用[.reference_title]
- *1* *2* [java集合中最大值、平均值以及总和计算问题(BigDecimal类型)](https://blog.csdn.net/weixin_43967890/article/details/121157321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [List使用Stream流进行集合Collection的各种运算汇总:对BigDecimal求和,某个字段的和、最大值、最小值、...](https://blog.csdn.net/weixin_32516271/article/details/113558795)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文