java8 利用reduce实现将列表中的多个元素的属性求和并返回操作
利用java8流的特性,我们可以实现list中多个元素的 属性求和 并返回。
案例:
有一个借款待还信息列表,其中每一个借款合同包括:本金、手续费;
现在欲将 所有的本金求和、所有的手续费求和。
我们可以使用java8中的函数式编程,获取list的流,再利用reduce遍历递减方式将同属性(本金、手续费)求和赋予给一个新的list中同类型的对象实例,即得到我们需要的结果:
A a = list.stream() .reduce( (x , y) -> new A( (x.getPrincipal() + y.getPrincipal()), (x.getFee() + y.getFee()) ) ) .orElse( new A(0, 0) );
示例代码如下:
package org.byron4j.eight; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class ReduceTwoObjectAddProp { class A{ int principal = 0; int fee = 0; public A(int principal, int fee) { super(); this.principal = principal; this.fee = fee; } public A() { super(); // TODO Auto-generated constructor stub } public int getPrincipal() { return principal; } public void setPrincipal(int principal) { this.principal = principal; } public int getFee() { return fee; } public void setFee(int fee) { this.fee = fee; } @Override public String toString() { return "A [principal=" + principal + ", fee=" + fee + "]"; } } @Test public void test() { List<A> list = new ArrayList<A>(); list.add(new A(1, 2)); list.add(new A(100, 200)); A a = list.stream() .reduce( (x , y) -> new A( (x.getPrincipal() + y.getPrincipal()), (x.getFee() + y.getFee()) ) ) .orElse( new A(0, 0) ); System.out.println(a); } }
补充知识:在 Java 8 中如何使用 Stream.reduce() 对 BigDecimal 的列表求和?
在Java 8中,我们可以使用Stream.reduce()对BigDecimal的列表求和。
1. Stream.reduce()
Java示例,使用常规的for循环和stream.reduce()对BigDecimal值列表求和。
JavaBigDecimal.java
package com.mkyong; import java.math.BigDecimal; import java.util.LinkedList; import java.util.List; public class JavaBigDecimal { public static void main(String[] args) { List<BigDecimal> invoices = new LinkedList<>(); invoices.add(BigDecimal.valueOf(9.9)); invoices.add(BigDecimal.valueOf(1.0)); invoices.add(BigDecimal.valueOf(19.99)); invoices.add(BigDecimal.valueOf(0.2)); invoices.add(BigDecimal.valueOf(5.5)); // sum using a for loop BigDecimal sum = BigDecimal.ZERO; for (BigDecimal amt : invoices) { sum = sum.add(amt); } System.out.println("Sum = " + sum); // sum using stream BigDecimal sum2 = invoices.stream().reduce(BigDecimal.ZERO, BigDecimal::add); System.out.println("Sum (Stream) = " + sum2); } }
输出量
Sum = 36.59
Sum (Stream) = 36.59
2.地图和缩小
BigDecimal Invoices清单中的所有BigDecimal 。
JavaBigDecimalObject.java
package com.mkyong; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Arrays; import java.util.List; public class JavaBigDecimalObject { public static void main(String[] args) { List<Invoice> invoices = Arrays.asList( new Invoice("I1001", BigDecimal.valueOf(9.99), BigDecimal.valueOf(1)), new Invoice("I1002", BigDecimal.valueOf(19.99), BigDecimal.valueOf(1.5)), new Invoice("I1003", BigDecimal.valueOf(4.888), BigDecimal.valueOf(2)), new Invoice("I1004", BigDecimal.valueOf(4.99), BigDecimal.valueOf(5)), new Invoice("I1005", BigDecimal.valueOf(.5), BigDecimal.valueOf(2.3)) ); BigDecimal sum = invoices.stream() .map(x -> x.getQty().multiply(x.getPrice())) // map .reduce(BigDecimal.ZERO, BigDecimal::add); // reduce System.out.println(sum); // 75.851 System.out.println(sum.setScale(2, RoundingMode.HALF_UP)); // 75.85 } } class Invoice { String invoiceNo; BigDecimal price; BigDecimal qty; public Invoice(String invoiceNo, BigDecimal price, BigDecimal qty) { this.invoiceNo = invoiceNo; this.price = price; this.qty = qty; } public String getInvoiceNo() { return invoiceNo; } public void setInvoiceNo(String invoiceNo) { this.invoiceNo = invoiceNo; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public BigDecimal getQty() { return qty; } public void setQty(BigDecimal qty) { this.qty = qty; } }
输出量
75.851
75.85
以上这篇java8 利用reduce实现将列表中的多个元素的属性求和并返回操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot项目使用slf4j的MDC日志打点功能(最新推荐)
这篇文章主要介绍了SpringBoot项目使用slf4j的MDC日志打点功能,本文通过示例代码给大家介绍非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-06-06Spring Boot高级教程之Spring Boot连接MySql数据库
这篇文章主要为大家详细介绍了Spring Boot高级教程之Spring Boot连接MySql数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-10-10Java中使用ConcurrentHashMap实现线程安全的Map
在Java中,ConcurrentHashMap是一种线程安全的哈希表,可用于实现多线程环境下的Map操作。它支持高并发的读写操作,通过分段锁的方式实现线程安全,同时提供了一些高级功能,比如迭代器弱一致性和批量操作等。ConcurrentHashMap在高并发场景中具有重要的应用价值2023-04-04在Java和Java Web中放置图片、视频、音频、图像文件的方法
在Java软件中放置图片,通常涉及将图片文件(如JPEG、PNG等)作为资源包含在我们的项目中,并在代码中通过适当的方式引用这些资源,这可以通过多种方式实现,但最常见的是在Java桌面应用(如Swing或JavaFX)或Web应用(如Servlet/JSP)中2024-11-11
最新评论