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)文章
SpringBoot項(xiàng)目使用slf4j的MDC日志打點(diǎn)功能(最新推薦)
這篇文章主要介紹了SpringBoot項(xiàng)目使用slf4j的MDC日志打點(diǎn)功能,本文通過(guò)示例代碼給大家介紹非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Spring Boot高級(jí)教程之Spring Boot連接MySql數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了Spring Boot高級(jí)教程之Spring Boot連接MySql數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Java中使用ConcurrentHashMap實(shí)現(xiàn)線程安全的Map
在Java中,ConcurrentHashMap是一種線程安全的哈希表,可用于實(shí)現(xiàn)多線程環(huán)境下的Map操作。它支持高并發(fā)的讀寫操作,通過(guò)分段鎖的方式實(shí)現(xiàn)線程安全,同時(shí)提供了一些高級(jí)功能,比如迭代器弱一致性和批量操作等。ConcurrentHashMap在高并發(fā)場(chǎng)景中具有重要的應(yīng)用價(jià)值2023-04-04JAVA實(shí)現(xiàn)圖書管理系統(tǒng)項(xiàng)目
相信每一個(gè)學(xué)生學(xué)編程的時(shí)候,應(yīng)該都會(huì)寫一個(gè)小項(xiàng)目——圖書管理系統(tǒng)。為什么這么說(shuō)呢?我認(rèn)為一個(gè)學(xué)校的氛圍很大一部分可以從圖書館的氛圍看出來(lái),而圖書管理系統(tǒng)這個(gè)不大不小的項(xiàng)目,接觸的多,也比較熟悉,不會(huì)有陌生感,能夠練手,又有些難度,所以我的小項(xiàng)目也來(lái)了2021-10-10在Java和Java Web中放置圖片、視頻、音頻、圖像文件的方法
在Java軟件中放置圖片,通常涉及將圖片文件(如JPEG、PNG等)作為資源包含在我們的項(xiàng)目中,并在代碼中通過(guò)適當(dāng)?shù)姆绞揭眠@些資源,這可以通過(guò)多種方式實(shí)現(xiàn),但最常見的是在Java桌面應(yīng)用(如Swing或JavaFX)或Web應(yīng)用(如Servlet/JSP)中2024-11-11