- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
使用java 8 Stream.reduce()方法简化BigDecimal对象的求和。
从本质上讲,BigDecimals
是不可变的,这意味着一旦创建了对象,就无法对其进行修改,因此在执行算术运算时,它们并不是那么友好或高效。有许多处理原语的库,例如 Guava's math utilities,但在本教程中,我们将展示 java 8 如何简化从集合中对一系列 BigDecimal进行求和。
从 Maven 原型创建一个项目并将其导入 Eclipse,我们将更新 junit。初始化一个 BigDecimals
类型的 Arraylist,我们将在 setUp 方法中添加总和为 15 的元素。
List<BigDecimal> bigDecimalsValues = new ArrayList<>();
@Before
public void setUp () {
bigDecimalsValues.add(new BigDecimal(1));
bigDecimalsValues.add(new BigDecimal(2));
bigDecimalsValues.add(new BigDecimal(3));
bigDecimalsValues.add(new BigDecimal(4));
bigDecimalsValues.add(new BigDecimal(5));
}
让我们回顾一下在 java 8 (5, 6, 7) 之前的 java 版本中这是什么样子的。您将需要创建一个对象来存储总和值并使用 for 循环遍历 ArrayList。当您调用 .add
时,它会生成一个新对象,我们需要在其中设置 addBigDecimals
等于结果。使用 junit 断言语句,我们将验证结果是否等于 15。
@Test
public void add_big_decimals_java() {
BigDecimal addBigDecimals = new BigDecimal(0);
for (BigDecimal value : bigDecimalsValues) {
addBigDecimals = addBigDecimals
.add(new BigDecimal(value.intValue()));
}
assertEquals(new BigDecimal(15), addBigDecimals);
}
Java 8 引入了终端操作,例如平均、求和、最小、最大和计数,它们以自己的方式包装通用 Stream.reduce
。将 arraylist 转换为流将使我们能够调用传入 BigDecimal.ZERO
作为标识的通用 reduce 方法和 BigDecimal::add
累加器方法。
@Test
public void add_big_decimals_java8() {
BigDecimal sumOfBigDecimals = bigDecimalsValues.stream().reduce(
BigDecimal.ZERO, BigDecimal::add);
assertEquals(new BigDecimal(15), sumOfBigDecimals);
}
接下来,如果您正在处理 BigDecimal 列表中的空值,当您尝试将它们全部加在一起时,您很可能会遇到 NullPointerException
。使用流,我们可以在归约操作之前过滤空值以避免错误。如果您还没有使用 java 8,您可以使用 guava 并从您的数组列表中过滤空引用。
@Test
public void add_big_decimals_java8_null() {
bigDecimalsValues.add(null);
BigDecimal sumOfBigDecimals = bigDecimalsValues.stream()
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
assertEquals(new BigDecimal(15), sumOfBigDecimals);
}
在我们的最后一个片段中,我们将对 BigDecimal 类型的给定对象的字段求和。首先,我们将创建一个对象 Car
,该对象具有类型为 BigDecimal
的字段英里。将里程声明为 BigDecimal
是出于演示目的,因为您可能不会在现实世界中这样做。接下来,我们将使用菱形运算符添加 Car
对象来初始化一个列表。需要注意的是,我们添加了一个空Car对象,并使用空英里值初始化了一个Car对象。
一旦我们向Car对象添加值,我们将需要编写代码来使用 java 8 语法对列表中的所有值求和。请记住,我们首先需要过滤 null Car
和里程设置为 null 的Car对象。接下来调用 .map
并返回 BigDecimals
的流,就像以前一样,将减少值并对元素求和。
class Car {
private BigDecimal miles;
public Car(BigDecimal miles) {
super();
this.miles = miles;
}
public BigDecimal getMiles() {
return miles;
}
public void setMiles(BigDecimal miles) {
this.miles = miles;
}
}
@Test
public void add_big_decimals_java8_object() {
List<Car> vehicles = new ArrayList<>();
vehicles.add(null);
vehicles.add(new Car(null));
vehicles.add(new Car(new BigDecimal("10")));
vehicles.add(new Car(new BigDecimal("20")));
BigDecimal sumOfBigDecimals = vehicles.stream()
.filter(Objects::nonNull)
.filter(c -> c.getMiles() != null)
.map(Car::getMiles)
.reduce(BigDecimal.ZERO, BigDecimal::add);
assertEquals(new BigDecimal(30), sumOfBigDecimals);
}
当你做这样的事情 BigDecimal bigDecimal = BigDecimal.ONE; 为什么bigDecimal成为一个新对象? 最佳答案 在这种情况下,变量(或字段)bigDecimal
我正在使用 BigDecimal 计算一些大实数。虽然我尝试了两种方法:BigDecimal.toString() 或 BigDecimal.stripTrailingZeros().toString
我广泛使用 BigDecimals。我经常需要进行长时间的计算,然后比较结果。由于这些漫长的计算,答案不是 1而是0.9999999... 。这就是为什么我无法精确比较 BigDecimals,而只能
我有一段代码有两个 BigDecimal 变量。这两个变量都被发送到方法格式(工作正常)然后打印。变量“d”被发送到格式方法,然后直接打印而不分配它(因为格式方法返回一个字符串)。问题出现在变量 a
我遇到过 java.math.BigDecimal 和 android.icu.math.BigDecimal 因为我需要在项目中使用 BigDecimal . 我意识到 Android BigDec
我在整个应用程序中使用 BigDecimal 来处理金钱 和百分比。但是,我需要一种方法来区分两者之间的用法(为了呈现它们,即在 JTable 中)。因此,我最初的想法是编写两个行为与 BigDeci
这应该很简单,但它正在爆炸。有什么想法吗? d = BigDecimal.new("2.0") YAML::load({:a => d}.to_yaml) TypeError: BigDecimal
我有两个 BigDecimal,我想根据它们的 significant digits 确定它们是否接近。 . 例如,请考虑以下内容: BigDecimal million = new BigDecim
我需要一种方法将其表达为有效的java代码:我有2个BigDecimals,我想知道较小的BigDecimal是否可以(当添加到较大的BigDecimals时) BigDecimal 一次)更改较大
我正在争论是使用 BigDecimal 和 BigInteger 还是仅使用 BigDecimal 来让我的生活更轻松,减少来回转换。在资源方面仅使用 BigDecimal 有缺点吗? 仅使用原始数据
我有以下代码: Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_45). scala> v
我有一个 java 客户端,它通过 GRPC 调用 Clojure 服务。问题是,当我们从他们的服务收到响应时,它会在大十进制的末尾添加字母。当我们尝试在 java 中将其转换为大十进制时,我们会收到
我仍在学习 Java,并且一直在阅读多个站点上的文章。我在 Java Code Geeks 找到了一篇文章我有一个问题。该文章正在解释开放/封闭原则。本文以对公司产品应用折扣的场景为例。第一部分代码如
我正在尝试对 List 中的多个 BigDecimals 求和.目前,我正在使用两个流,但如果可能的话,我希望只有一个流。我不确定如何以高效的方式重写下面的内容。 BigDecimal totalCh
下面两行代码有什么区别? BigDecimal one = new BigDecimal("1"); BigDecimal two = BigDecimal.ONE; 两条线是否相同? 谢谢! 最佳答
这个问题在这里已经有了答案: BigDecimal from Double incorrect value? (4 个答案) Convert double to BigDecimal and set
在 Java 中,来自另一个 bigDecimal.toString() 的新 BigDecimal 是否总是等于?例如 BigDecimal a = new BigDecimal("1.23
对于新变量的比较或初始化,您使用其中的哪一个会有所不同吗? 我知道 BigDecimal.ZERO 是 1.5 的功能,所以这是一个问题,但假设我使用的是 1.5,这有关系吗? 谢谢。 最佳答案 Bi
情况: public static double pi(int a) { return (BigDecimal.valueOf(53360*sqrt(640320))).divide(co
我正在尝试创建一个可以在 diesel 中用于插入的结构。具体来说,我正在使结构可插入。编译时出现此错误。 我有一个结构,我正试图通过 derive 属性使 Insertable 成为可能。我有一个名
我是一名优秀的程序员,十分优秀!