• 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. }

    附录:所有收集器

     

     

  • 相关阅读:
    Hyperledger Fabric 部署在多个主机上
    WebRTC QoS方法之Pacer实现
    高效擦除/移除(Erase–remove idiom)std::vector元素
    前端进击笔记第十八节 实战:三天实现管理端系统
    62. UE5 RPG 近战攻击获取敌人并造成伤害
    iOS 在OC旧项目中使用Swift进行混编
    蓝桥每日一题(day 4: 蓝桥592.门牌制作)--模拟--easy
    python解析命令行参数为dict
    第三十节——组合式API组件传值
    使用关键字abstract 声明抽象类-PHP8知识详解
  • 原文地址:https://blog.csdn.net/Day_and_Night_2017/article/details/125904254