java8 利用reduce實(shí)現(xiàn)將列表中的多個(gè)元素的屬性求和并返回操作
利用java8流的特性,我們可以實(shí)現(xiàn)list中多個(gè)元素的 屬性求和 并返回。
案例:
有一個(gè)借款待還信息列表,其中每一個(gè)借款合同包括:本金、手續(xù)費(fèi);
現(xiàn)在欲將 所有的本金求和、所有的手續(xù)費(fèi)求和。
我們可以使用java8中的函數(shù)式編程,獲取list的流,再利用reduce遍歷遞減方式將同屬性(本金、手續(xù)費(fèi))求和賦予給一個(gè)新的list中同類型的對(duì)象實(shí)例,即得到我們需要的結(jié)果:
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);
}
}
補(bǔ)充知識(shí):在 Java 8 中如何使用 Stream.reduce() 對(duì) BigDecimal 的列表求和?
在Java 8中,我們可以使用Stream.reduce()對(duì)BigDecimal的列表求和。
1. Stream.reduce()
Java示例,使用常規(guī)的for循環(huán)和stream.reduce()對(duì)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實(shí)現(xiàn)將列表中的多個(gè)元素的屬性求和并返回操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java空格替換逗號(hào)的實(shí)現(xiàn)示例
在編程中,我們經(jīng)常需要對(duì)字符串進(jìn)行各種處理,其中一個(gè)常見(jiàn)的需求是將字符串中的逗號(hào)替換為空格,本文主要介紹了Java空格替換逗號(hào)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
基于JavaSwing設(shè)計(jì)和實(shí)現(xiàn)的酒店管理系統(tǒng)
這篇文章主要介紹了基于JavaSwing+mysql的酒店管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn),它可以實(shí)現(xiàn)酒店日常的管理功能包括開(kāi)房、退房、房間信息、顧客信息管理等2021-08-08
解決@SpringBootTest 單元測(cè)試遇到的坑
這篇文章主要介紹了解決@SpringBootTest 單元測(cè)試遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
java通過(guò)JFrame做一個(gè)登錄系統(tǒng)的界面完整代碼示例
這篇文章主要介紹了java通過(guò)JFrame做一個(gè)登錄系統(tǒng)的界面完整代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
Java中利用BitMap位圖實(shí)現(xiàn)海量級(jí)數(shù)據(jù)去重
有許多方法可以用來(lái)去重,比如使用列表、集合等等,但這些方法通常只適用于一般情況,然而,當(dāng)涉及到大量數(shù)據(jù)去重時(shí),常見(jiàn)的 Java Set、List,甚至是 Java 8 的新特性 Stream 流等方式就顯得不太合適了,本文給大家介紹了Java中利用BitMap位圖實(shí)現(xiàn)海量級(jí)數(shù)據(jù)去重2024-04-04
使用spring.profiles.active來(lái)分區(qū)配置的方法示例
這篇文章主要介紹了使用spring.profiles.active來(lái)分區(qū)配置的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01

