首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一次执行多个运算(求和和平均)的java8 reduce

一次执行多个运算(求和和平均)的java8 reduce
EN

Stack Overflow用户
提问于 2020-05-22 17:22:39
回答 1查看 202关注 0票数 0

我有一个项目"Fatturato“的列表,我已经计算了一个字段和另一个字段的平均值。我想知道我是否可以使用“reduce”方法用一行独特的代码来做到这一点,目前我已经用了多行代码。我想在reduce中使用divide方法,但我不知道如何定义(只在最后一次迭代时,当sum结束时)

代码语言:javascript
运行
复制
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 + "]";
    }
}

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-22 18:49:37

你想得太多了。您不能简单地使用一条神奇的线条来求和和平均这些值,同时将它们添加到一个新对象中。您通过reduce实现的方法是正确的,但是它要求使用reduce方法的Optional<Fatturato>返回类型的优势进行略微的改进。另外,不要忘记您正在处理冗长的类Big*,所以只要Java不支持操作符重载,整个代码就会变得臃肿,这在这个用例中很有用。

代码语言:javascript
运行
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61951747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档