java函数式编程 Collectors.groupingBy

705 阅读1分钟

代码

@Slf4j
@Data
@AllArgsConstructor
public class Motor {

    private String type;

    private String brand;

    private Integer price;

    public static void main(String[] args) {

        List<Motor> motors = Arrays.asList(
                new Motor("H2", "kawasaki", 23),
                new Motor("Ninja400", "kawasaki", 5),
                new Motor("Ninja250", "kawasaki", 4),
                new Motor("RS1200GS DAV", "BWM", 23),
                new Motor("NK250", "CF", 2),
                new Motor("GSX250", "SUZUKI", 3),
                new Motor("DL250", "SUZUKI", 3)
        );

        // 分组 ,
        Map<String, List<Motor>> motorMap =motors.stream().collect(Collectors.groupingBy(Motor::getBrand));
        log.info("motorMap: {}", motorMap);

        // 分组 - 转换结果集 ,
        Map<String, List<String>> typeMap =motors.stream().collect(Collectors.groupingBy(Motor::getBrand,Collectors.mapping(Motor::getType, Collectors.toList())));
        log.info("typeMap: {}", typeMap);

        // 分组-计数
        Map<String, Long> countMap = motors.stream().collect(Collectors.groupingBy(Motor::getBrand, Collectors.counting()));
        log.info("countMap: {}", countMap);

        // 排序
        countMap.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed()).forEachOrdered(System.out::println);

        // 分组-求和
        Map<String, Integer> sumMap = motors.stream().collect(Collectors.groupingBy(Motor::getBrand, Collectors.summingInt(Motor::getPrice)));
        log.info("sumMap: {}", sumMap);

    }
}

运行结果

motorMap: {SUZUKI=[Motor(type=GSX250, brand=SUZUKI, price=3), Motor(type=DL250, brand=SUZUKI, price=3)], CF=[Motor(type=NK250, brand=CF, price=2)], BWM=[Motor(type=RS1200GS DAV, brand=BWM, price=23)], kawasaki=[Motor(type=H2, brand=kawasaki, price=23), Motor(type=Ninja400, brand=kawasaki, price=5), Motor(type=Ninja250, brand=kawasaki, price=4)]}   
typeMap: {SUZUKI=[GSX250, DL250], CF=[NK250], BWM=[RS1200GS DAV], kawasaki=[H2, Ninja400, Ninja250]}
countMap: {SUZUKI=2, CF=1, BWM=1, kawasaki=3}
kawasaki=3
SUZUKI=2
CF=1
BWM=1
sumMap: {SUZUKI=6, CF=2, BWM=23, kawasaki=32}