• One bite of Stream(9)


    Partitioning

    其实partitioning属于groupingBy的一种特殊情况,那就是二分,分成两组。

    1. Map> partitionedMenu = menu.stream()
    2. .collect(partitioningBy(Dish::isVegetarian));
    3. List vegetarianDishes = partitionedMenu.get(true);

    根据partitioningBy的条件,分为True和False各一组。

    但是这种又可以直接使用filter来实现:

    1. List vegetarianDishes = menu.stream()
    2. .filter(Dish::isVegetarian).collect(toList());

    我们来看看更高级一些的用法:

    1. 二次分组,先partitioningBy再groupingBy

    1. Map>> vegetarianDishesByType = menu.stream()
    2. .collect(partitioningBy(Dish::isVegetarian,
    3. groupingBy(Dish::getType)));

    相当于先进行了一次二分组,划分出是否素食,然后在素食和非素食内部再根据type进行分组。

    2. 先二分,再求算最大值

    1. Map mostCaloricPartitionedByVegetarian = menu.stream().collect(
    2. partitioningBy(Dish::isVegetarian,
    3. collectingAndThen(maxBy(comparingInt(Dish::getCalories)),
    4. Optional::get)));

    先进行了一次二分组,划分出是否素食,然后素食和非素食内部根据Calories进行比较,找到最大的Dish,然后取到。

    在这里看,partitioningBy和groupingBy没有太大的区别,一个是多分组,另外一个是二分罢了。

    一个实例,判断质数合数:

    1. public boolean isPrime(int candidate) {
    2. return IntStream.range(2, candidate).noneMatch(i -> candidate % i == 0);
    3. }

    实际上不需要计算这么多,只需要到平方根即可:

    1. public boolean isPrime(int candidate) {
    2. int candidateRoot = (int) Math.sqrt((double) candidate);
    3. return IntStream.rangeClosed(2, candidateRoot)
    4. .noneMatch(i -> candidate % i == 0);
    5. }

    根据我们上述方法,可以进行二分了:

    1. public Map> partitionPrimes(int n) {
    2. return IntStream.rangeClosed(2, n)
    3. .boxed()
    4. .collect(partitioningBy(candidate -> isPrime(candidate)));
    5. }

    附录:所有收集器

     

     

  • 相关阅读:
    数据治理----集中、分布的各种模式傻傻分不清楚
    bugfix: com.alibaba.druid.sql.parser.EOFParserException: EOF
    【季度复盘】2022年5~7月复盘
    Android反编译apk
    C++ 基础入门 之 数组/一维数组/二维数组/定义形式/数组名的作用
    Redis 数据结构
    iptables之SNAT,DNAT原理与DNS分离解析实验
    解决telnet不是内部或外部以及验证某个端口是否开放
    单流 TCP 100Gbps+ 难题的直观解释
    SpringBoot Environment配置加载
  • 原文地址:https://blog.csdn.net/Day_and_Night_2017/article/details/125904254