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

所属分类: 软件编程 / java 阅读数: 76
收藏 0 赞 0 分享

利用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实现将列表中的多个元素的属性求和并返回操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

利用MultipartFile实现文件上传功能

这篇文章主要为大家详细介绍了利用MultipartFile实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java编程实现NBA赛事接口调用实例代码

这篇文章主要介绍了Java编程实现NBA赛事接口调用实例代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java编程之双重循环打印图形

这篇文章主要介绍了Java编程之双重循环打印图形,属于Java编程基础练习部分,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

java基础学习JVM中GC的算法

这篇文章主要介绍了java基础学习JVM中GC的算法,通过图文加深对GC算法思路的理解。
收藏 0 赞 0 分享

Java编程Post数据请求和接收代码详解

这篇文章主要介绍了Java编程Post数据请求和接收代码详解,涉及enctype的三种编码,post与get等相关内容,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Retrofit+Rxjava实现文件上传和下载功能

这篇文章主要介绍了Retrofit+Rxjava实现文件上传和下载功能,文中提到了单文件上传和多文件上传及相关参数的请求,需要的朋友参考下吧
收藏 0 赞 0 分享

Retrofit+Rxjava下载文件进度的实现

这篇文章主要介绍了Retrofit+Rxjava下载文件进度的实现,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java检查服务器的连通两种方法代码分享

这篇文章主要介绍了java检查服务器的连通两种方法代码分享,涉及ping的介绍以及检查服务器连通的两种方法代码示例,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java/Android 获取网络重定向文件的真实URL的示例代码

本篇文章主要介绍了Java/Android 获取网络重定向文件的真实URL的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java并发编程之同步器代码示例

这篇文章主要介绍了java并发编程之同步器代码示例,分享了相关代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享
查看更多