软件编程
位置:首页>> 软件编程>> java编程>> java8 利用reduce实现将列表中的多个元素的属性求和并返回操作

java8 利用reduce实现将列表中的多个元素的属性求和并返回操作

作者:东陆之滇  发布时间:2021-09-29 06:53:38 

标签: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

来源:https://blog.csdn.net/zixiao217/article/details/80673897

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com