当前位置: 首页 > 知识库问答 >
问题:

Java流。对对象流中的两个字段求和

张积厚
2023-03-14

我有这样的想法:

Integer totalIncome = carDealer.getBrands().stream().mapToInt(brand -> brand.getManufacturer().getIncome()).sum();
Integer totalOutcome = carDealer.getBrands().stream().mapToInt(brand -> brand.getManufacturer().getOutcome()).sum();

我怎么能把它写在一个流中呢?收集f.e.

编辑:

谢谢你们的评论、回答和参与。我会对使用流解决这个问题的不同方法提出问题。你对此有什么看法:

final IncomeAndOutcome incomeAndOutcome = carDealer.getBrands()
                    .stream()
                    .map(Brand::getManufacturer)
                    .map(IncomeAndOutcome::of)
                    .reduce(IncomeAndOutcome.ZERO, IncomeAndOutcome::sum);

static class IncomeAndOutcome {

    private static final IncomeAndOutcome ZERO = of(0, 0);

    @Getter
    private final int income;

    @Getter
    private final int outcome;

    public static IncomeAndOutcome of(final int income, final int outcome) {
        return new IncomeAndOutcome(income, outcome);
    }

    public static IncomeAndOutcome of(final Manufacturer manufacturer) {
        return new IncomeAndOutcome(manufacturer.getIncome(), manufacturer.getOutcome());
    }

    IncomeAndOutcome(final int income, final int outcome) {
        this.income = income;
        this.outcome = outcome;
    }

    IncomeAndOutcome sum(final IncomeAndOutcome incomeAndOutcome) {
        return of(this.income + incomeAndOutcome.getIncome(), this.outcome + incomeAndOutcome.getOutcome());
    }
}

共有1个答案

计胤
2023-03-14

没有正确的测量——一切都是猜测。我唯一同意的论点是可读性——这里几乎没有这种情况;但是如果你出于学术目的想知道这个,你可以这样做:

int[] result = carDealer.getBrands()
         .stream()
         .map(brand -> new int[]{brand.getManufacturer().getIncome(),
                                 brand.getManufacturer().getOutcome()})
         .collect(Collector.of(
                    () -> new int[2],
                    (left, right) -> {
                        left[0] += right[0];
                        left[1] += right[1];
                    },
                    (left, right) -> {
                        left[0] += right[0];
                        left[1] += right[1];
                        return left;
                    }));
 类似资料:
  • 我想创建对象MyObject的实例,其中的每个字段都是该字段值的总和 我创建一个对象 然后我构建对象列表: 我想要创建对象() 很容易对每个流求和一个字段: 或 然后构造对象

  • 我正在尝试对List的字段求和并返回值。我想为此使用流,但我对流不熟悉,不确定流是否可以完成此操作。这是我尝试过的,但我认为语法不正确。 上下文的相关类结构。 获取总价和单价方法

  • 假设我有一个实现下面接口的对象列表: 假设我也有一个类,它能够对这些对象进行求和: 我在玩一个自定义收集器,但无法找到一些整洁的解决方案。

  • 我有这样的代码: 有什么想法吗?

  • 让我们假设有一个福克斯类,它有名字、颜色和年龄。假设我有一份狐狸的名单,我想打印出那些狐狸的名字,它们的颜色是绿色的。我想使用流来这样做。 字段: 名称:私有字符串 颜色:专用字符串 年龄:私有整数 我写了以下代码来做过滤和Sysout: 但是,我的代码中存在一些语法问题。 到底是什么问题?我该怎么整理?

  • 如何以另一种方式从流中添加两个不同列表中的对象? 这里有一个例子