我还有下一堂课:
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();
}
但是此代码计算所有元素大小的总和。我在这里能做什么?将不胜感激任何建议!
逻辑是:对于每个订单,对元素求和:
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()));