列表映射:对列表的所有值求和 class

Map of List: Sum all the values of the list class

我有这个class

public Car(Colour colour, int passengers) {
    this.colour = colour;
    this.passengers = passengers;
}

其中 Color 是一个枚举:

   public enum Colour {
    RED, YELLOW, GREEN, BLACK, WHITE, BLUE, GREY
}

我创建了这张地图:

Map<Colour, List<Car>> colourListMap = new HashMap<>();

假设我们填充列表映射:

Car yellowCar = new Car(Colour.YELLOW, 4);
Car blueCar = new Car(Colour.BLUE, 1);
Car blackCar = new Car(Colour.BLACK, 3);

Map<Colour, List<Car>> map = carMemory.addCarByColour(yellowCar);
carMemory.addCarByColour(blueCar);
carMemory.addCarByColour(blackCar);

还有 2 个相同颜色的实例:

Car redCar = new Car(Colour.RED, 2);
Car redCar2 = new Car(Colour.RED, 6);
Map<Colour, List<Car>> map = carMemory.addCarByColour(redCar);
carMemory.addCarByColour(redCar2);

有没有一种简单的方法可以对 Car class 中的所有乘客求和?而不是通过颜色调用键?我想 Java 8 Stream...但我不是很自信。

我知道这是不正确的。

int size =  map.values()
                .stream()
                .mapToInt(Collection::size)
                .sum();

如果您需要地图中所有汽车的所有乘客的总和:

            map.values()
                .stream()
                .flatMap(List::stream) // Stream of car objects
                .mapToInt(Car::getPassengers)
                .sum();

过滤颜色的示例:

           map.entrySet()
                .stream()
                .filter(entry -> entry.getKey() == Colour.RED ||
                                 entry.getKey() == Colour.BLACK) // only entries for BLACK and RED will remain
                .map(Map.Entry::getValue) // Stream<List<Car>>
                .flatMap(List::stream) // Stream<Car>
                .mapToInt(Car::getPassengers)
                .sum();

旁注:

  • 对于具有 enum-keys 的 Map 使用 EnumMap 而不是 HashMap,此 special-purpose 实现旨在仅与枚举一起使用并且具有更好的性能。