java8 利用reduce实现将列表中的多个元素的属性求和并返回操作
利用java8流的特性,我们可以实现list中多个元素的属性求和并返回。
案例:
有一个借款待还信息列表,其中每一个借款合同包括:本金、手续费;
现在欲将所有的本金求和、所有的手续费求和。
我们可以使用java8中的函数式编程,获取list的流,再利用reduce遍历递减方式将同属性(本金、手续费)求和赋予给一个新的list中同类型的对象实例,即得到我们需要的结果:
Aa=list.stream() .reduce( (x,y)->newA((x.getPrincipal()+y.getPrincipal()),(x.getFee()+y.getFee()))) .orElse(newA(0,0));
示例代码如下:
packageorg.byron4j.eight;
importjava.util.ArrayList;
importjava.util.List;
importorg.junit.Test;
publicclassReduceTwoObjectAddProp{
classA{
intprincipal=0;
intfee=0;
publicA(intprincipal,intfee){
super();
this.principal=principal;
this.fee=fee;
}
publicA(){
super();
//TODOAuto-generatedconstructorstub
}
publicintgetPrincipal(){
returnprincipal;
}
publicvoidsetPrincipal(intprincipal){
this.principal=principal;
}
publicintgetFee(){
returnfee;
}
publicvoidsetFee(intfee){
this.fee=fee;
}
@Override
publicStringtoString(){
return"A[principal="+principal+",fee="+fee+"]";
}
}
@Test
publicvoidtest(){
Listlist=newArrayList();
list.add(newA(1,2));
list.add(newA(100,200));
Aa=list.stream()
.reduce(
(x,y)->newA((x.getPrincipal()+y.getPrincipal()),(x.getFee()+y.getFee())))
.orElse(newA(0,0));
System.out.println(a);
}
}
补充知识:在Java8中如何使用Stream.reduce()对BigDecimal的列表求和?
在Java8中,我们可以使用Stream.reduce()对BigDecimal的列表求和。
1.Stream.reduce()
Java示例,使用常规的for循环和stream.reduce()对BigDecimal值列表求和。
JavaBigDecimal.java
packagecom.mkyong;
importjava.math.BigDecimal;
importjava.util.LinkedList;
importjava.util.List;
publicclassJavaBigDecimal{
publicstaticvoidmain(String[]args){
Listinvoices=newLinkedList<>();
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));
//sumusingaforloop
BigDecimalsum=BigDecimal.ZERO;
for(BigDecimalamt:invoices){
sum=sum.add(amt);
}
System.out.println("Sum="+sum);
//sumusingstream
BigDecimalsum2=invoices.stream().reduce(BigDecimal.ZERO,BigDecimal::add);
System.out.println("Sum(Stream)="+sum2);
}
}
输出量
Sum=36.59
Sum(Stream)=36.59
2.地图和缩小
BigDecimalInvoices清单中的所有BigDecimal。
JavaBigDecimalObject.java
packagecom.mkyong;
importjava.math.BigDecimal;
importjava.math.RoundingMode;
importjava.util.Arrays;
importjava.util.List;
publicclassJavaBigDecimalObject{
publicstaticvoidmain(String[]args){
Listinvoices=Arrays.asList(
newInvoice("I1001",BigDecimal.valueOf(9.99),BigDecimal.valueOf(1)),
newInvoice("I1002",BigDecimal.valueOf(19.99),BigDecimal.valueOf(1.5)),
newInvoice("I1003",BigDecimal.valueOf(4.888),BigDecimal.valueOf(2)),
newInvoice("I1004",BigDecimal.valueOf(4.99),BigDecimal.valueOf(5)),
newInvoice("I1005",BigDecimal.valueOf(.5),BigDecimal.valueOf(2.3))
);
BigDecimalsum=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
}
}
classInvoice{
StringinvoiceNo;
BigDecimalprice;
BigDecimalqty;
publicInvoice(StringinvoiceNo,BigDecimalprice,BigDecimalqty){
this.invoiceNo=invoiceNo;
this.price=price;
this.qty=qty;
}
publicStringgetInvoiceNo(){
returninvoiceNo;
}
publicvoidsetInvoiceNo(StringinvoiceNo){
this.invoiceNo=invoiceNo;
}
publicBigDecimalgetPrice(){
returnprice;
}
publicvoidsetPrice(BigDecimalprice){
this.price=price;
}
publicBigDecimalgetQty(){
returnqty;
}
publicvoidsetQty(BigDecimalqty){
this.qty=qty;
}
}
输出量
75.851
75.85
以上这篇java8利用reduce实现将列表中的多个元素的属性求和并返回操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。