如何使用 Stream API 计算每个 Element 的 int 字段的总和?

问题描述 投票:0回答:1

我还有下一堂课:

public class Order {
    private List<Element> elements;
}

public class Element {
    private int size;
}

我需要创建一个方法,使用 Stream API 返回订单为

keys
的地图,以及订单中每个元素大小的总和为
values

例如

List<Order> orders = new ArrayList<>();

orders.add(Order.createOrder(List.of(element1, element2, element3)));
orders.add(Order.createOrder(List.of(element3)));

我们应该得到:

{order1 = 75, order2 = 30}

因为

size
element1 = 20, element2 = 25, element3 = 30

我尝试过这样的事情:

private static Map<Order, Integer> calculate(List<Order> orders) {
    return  orders.stream()
        .flatMap(o -> o.getElements().stream())
        .mapToInt(el -> el.getSize())
        .sum();
}

但是此代码计算所有元素大小的总和。我在这里能做什么?将不胜感激任何建议!

java java-8 java-stream
1个回答
2
投票

逻辑是:对于每个订单,对元素求和:

class Element {
    private int value;
    public Element(int v) { value = v; }
    public int getValue() { return value; }
    public String toString() { return ""+value; }
}
class Order {
    public String name;
    public List<Element> elements;
    public Order(String n, List<Element> l) { name = n; elements = l; }
    public String toString() { return name; }
    public static Order createOrder(String n, List<Element> l) { return new Order(n,l); }
}

public class Main {
    public static void main(String []a) {
        List<Order> orders = new ArrayList<>();

        Element element1 = new Element(20);
        Element element2 = new Element(25);
        Element element3 = new Element(30);

        orders.add(Order.createOrder("order1", List.of(element1, element2, element3)));
        orders.add(Order.createOrder("order2", List.of(element3)));

        Map<Order,Integer> r = orders.stream()
                .collect(Collectors.toMap(o -> o, o -> o.elements.stream().mapToInt(Element::getValue).sum()));
        System.out.println(r);
    }
}

给出:

{order1=75, order2=30}

如果您想要

Map<String,Integer>
那么:

Map<String,Integer> r = orders.stream()
                .collect(Collectors.toMap(Object::toString, o -> o.elements.stream().mapToInt(Element::getValue).sum()));
© www.soinside.com 2019 - 2024. All rights reserved.