java8一次减少多次操作(求和和平均)
java8 reduce with multiple operation (sum and average) in one shot
我有一个项目列表 "Fatturato",我计算了一个字段的总和和另一个字段的平均值。
我想知道我是否可以使用 "the reduce" 方法用一行独特的代码来完成它,目前我已经用多行代码完成了。我想在 reduce 中使用 divide 方法,但我不知道如何定义(只在最后一次迭代时做,当总和结束时)
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Main {
public static void main (String args[]) {
List<Fatturato> listFatturato = new ArrayList<Fatturato>();
Fatturato ftt1 = new Fatturato(new BigDecimal(5000), new BigDecimal(20));
Fatturato ftt2 = new Fatturato(new BigDecimal(1000), new BigDecimal(34));
Fatturato ftt3 = new Fatturato(new BigDecimal(4000), new BigDecimal(67));
listFatturato.add(ftt1);
listFatturato.add(ftt2);
listFatturato.add(ftt3);
Optional<Fatturato> total = listFatturato.stream().reduce((f1, f2) -> new Fatturato()
.impFatturato(f1.getImpFatturato().add(f2.getImpFatturato()))
.percNostroPortafoglio(f1.getPercNostroPortafoglio().add(f2.getPercNostroPortafoglio()))
);
if (total.isPresent()) {
MathContext m = new MathContext(3, RoundingMode.HALF_UP);
Fatturato finalFatturato = total.get().percNostroPortafoglio(total.get().getPercNostroPortafoglio().divide(new BigDecimal(3), m));
System.out.println(finalFatturato);
}
}
}
import java.math.BigDecimal;
public class Fatturato {
private BigDecimal impFatturato;
private BigDecimal percNostroPortafoglio;
public Fatturato() {
super();
}
public Fatturato(BigDecimal impFatturato, BigDecimal percNostroPortafoglio) {
super();
this.impFatturato = impFatturato;
this.percNostroPortafoglio = percNostroPortafoglio;
}
public Fatturato impFatturato(BigDecimal impFatturato) {
this.impFatturato = impFatturato;
return this;
}
public Fatturato percNostroPortafoglio(BigDecimal percNostroPortafoglio) {
this.percNostroPortafoglio = percNostroPortafoglio;
return this;
}
public BigDecimal getImpFatturato() {
return impFatturato;
}
public BigDecimal getPercNostroPortafoglio() {
return percNostroPortafoglio;
}
@Override
public String toString() {
return "Fatturato [impFatturato=" + impFatturato + ", percNostroPortafoglio=" + percNostroPortafoglio + "]";
}
}
谢谢
你想多了。在将值添加到新对象时,您不能简单地使用一条神奇的线来求和和求平均值。您通过 reduce
的方法是正确的,但它要求使用 reduce
方法的 Optional<Fatturato>
return 类型的优势进行轻微改进。另外不要忘记你正在处理冗长的 类 Big*
所以只要 Java 不支持运算符重载,整个代码就会变得臃肿,我觉得这对这个很有用用例。
MathContext m = new MathContext(3, RoundingMode.HALF_UP);
listFatturato.stream()
// reducing >>> Fatturato(sum, sum)
.reduce((f1, f2) -> new Fatturato()
.impFatturato(f1.getImpFatturato().add(f2.getImpFatturato()))
.percNostroPortafoglio(f1.getPercNostroPortafoglio().add(f2.getPercNostroPortafoglio())))
// calculating average using listFatturato.size() >>> Fatturato(sum, avg)
.map(f -> new Fatturato(f.getImpFatturato(), f.getPercNostroPortafoglio()
.divide(new BigDecimal(listFatturato.size()), m)))
// printing out
.ifPresent(System.out::println);
我有一个项目列表 "Fatturato",我计算了一个字段的总和和另一个字段的平均值。 我想知道我是否可以使用 "the reduce" 方法用一行独特的代码来完成它,目前我已经用多行代码完成了。我想在 reduce 中使用 divide 方法,但我不知道如何定义(只在最后一次迭代时做,当总和结束时)
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Main {
public static void main (String args[]) {
List<Fatturato> listFatturato = new ArrayList<Fatturato>();
Fatturato ftt1 = new Fatturato(new BigDecimal(5000), new BigDecimal(20));
Fatturato ftt2 = new Fatturato(new BigDecimal(1000), new BigDecimal(34));
Fatturato ftt3 = new Fatturato(new BigDecimal(4000), new BigDecimal(67));
listFatturato.add(ftt1);
listFatturato.add(ftt2);
listFatturato.add(ftt3);
Optional<Fatturato> total = listFatturato.stream().reduce((f1, f2) -> new Fatturato()
.impFatturato(f1.getImpFatturato().add(f2.getImpFatturato()))
.percNostroPortafoglio(f1.getPercNostroPortafoglio().add(f2.getPercNostroPortafoglio()))
);
if (total.isPresent()) {
MathContext m = new MathContext(3, RoundingMode.HALF_UP);
Fatturato finalFatturato = total.get().percNostroPortafoglio(total.get().getPercNostroPortafoglio().divide(new BigDecimal(3), m));
System.out.println(finalFatturato);
}
}
}
import java.math.BigDecimal;
public class Fatturato {
private BigDecimal impFatturato;
private BigDecimal percNostroPortafoglio;
public Fatturato() {
super();
}
public Fatturato(BigDecimal impFatturato, BigDecimal percNostroPortafoglio) {
super();
this.impFatturato = impFatturato;
this.percNostroPortafoglio = percNostroPortafoglio;
}
public Fatturato impFatturato(BigDecimal impFatturato) {
this.impFatturato = impFatturato;
return this;
}
public Fatturato percNostroPortafoglio(BigDecimal percNostroPortafoglio) {
this.percNostroPortafoglio = percNostroPortafoglio;
return this;
}
public BigDecimal getImpFatturato() {
return impFatturato;
}
public BigDecimal getPercNostroPortafoglio() {
return percNostroPortafoglio;
}
@Override
public String toString() {
return "Fatturato [impFatturato=" + impFatturato + ", percNostroPortafoglio=" + percNostroPortafoglio + "]";
}
}
谢谢
你想多了。在将值添加到新对象时,您不能简单地使用一条神奇的线来求和和求平均值。您通过 reduce
的方法是正确的,但它要求使用 reduce
方法的 Optional<Fatturato>
return 类型的优势进行轻微改进。另外不要忘记你正在处理冗长的 类 Big*
所以只要 Java 不支持运算符重载,整个代码就会变得臃肿,我觉得这对这个很有用用例。
MathContext m = new MathContext(3, RoundingMode.HALF_UP);
listFatturato.stream()
// reducing >>> Fatturato(sum, sum)
.reduce((f1, f2) -> new Fatturato()
.impFatturato(f1.getImpFatturato().add(f2.getImpFatturato()))
.percNostroPortafoglio(f1.getPercNostroPortafoglio().add(f2.getPercNostroPortafoglio())))
// calculating average using listFatturato.size() >>> Fatturato(sum, avg)
.map(f -> new Fatturato(f.getImpFatturato(), f.getPercNostroPortafoglio()
.divide(new BigDecimal(listFatturato.size()), m)))
// printing out
.ifPresent(System.out::println);