统计专家 - AggregateUtil

    主要由下面几个部分组成:

    算术平均值.

    示例:**场景:** 求的User list 里面 id属性 的平均值

    返回:4.00

    1.2 avg(Collection<O>, String[], int)

    算术平均值.

    说明:

    • 返回的 LinkedHashMap,key是 propertyNames的元素,value是基于这个属性名称获得的值的平均值;key的顺序是依照 propertyNames元素的顺序示例:**场景:** 求的User list 里面 age 以及id属性 的平均值
    1. User user1 = new User(2L);
    2. user1.setAge(18);
    3. User user2 = new User(3L);
    4. user2.setAge(30);
    5. List<User> list = toList(user1, user2);
    6. Map<String, BigDecimal> map = AggregateUtil.avg(list, ConvertUtil.toArray("id", "age"), 2);
    7. LOGGER.info(JsonUtil.format(map));

    返回:

    1. {
    2. "id": 2.5,
    3. "age": 24
    4. }

    循环 objectCollection,统计 propertyName 的值出现的次数.

    • 返回的LinkedHashMap,key是propertyName对应的值,value是该值出现的次数;
    • 顺序是 objectCollection propertyName的值的顺序示例:场景: 统计user list,属性名字是name 的值的数量
    1. List<User> list = new ArrayList<>();
    2. list.add(new User("张飞"));
    3. list.add(new User("关羽"));
    4. list.add(new User("刘备"));
    5. list.add(new User("刘备"));
    6. Map<String, Integer> map = AggregateUtil.groupCount(list, "name");

    返回:

    1. {
    2. "张飞": 1,
    3. "关羽": 1,
    4. "刘备": 2
    5. }

    2.2 groupCount(Collection<O>, String, Predicate<O>)

    循环 objectCollection,只选择符合 includePredicate的对象,统计 propertyName的值出现的次数.

    说明:

    • 返回的LinkedHashMap,key是propertyName对应的值,value是该值出现的次数;
    • 顺序是 objectCollection propertyName的值的顺序示例:**场景:** 统计user list(条件是 age > 30 的user),name属性值的数量

    返回:

    1. {
    2. "赵云": 1
    3. }

    总和,计算集合对象objectCollection 内指定的属性名 propertyName 值的总和.

    说明:

    • 如果通过反射某个元素值是null,则使用默认值0代替,再进行累加示例:
    1. List<User> list = new ArrayList<>();
    2. list.add(new User(2L));
    3. list.add(new User(5L));
    4. list.add(new User(5L));
    5. LOGGER.info("" + AggregateUtil.sum(list, "id"));

    返回:12

    说明:当你需要写这样的代码的时候,

    1. protected Integer getCookieShoppingCartLinesQty(List<CookieShoppingCartLine> cartLineList){
    2. Integer qty = 0;
    3. //获取cookie中的购物车行集合
    4. if (null != cartLineList && cartLineList.size() > 0){
    5. for (Iterator iterator = cartLineList.iterator(); iterator.hasNext();){
    6. CookieShoppingCartLine cookieShoppingCartLine = (CookieShoppingCartLine) iterator.next();
    7. qty += cookieShoppingCartLine.getQuantity();
    8. }
    9. }
    10. return qty;
    11. }

    你可以写成:

    1. protected Integer getCookieShoppingCartLinesQty(List<CookieShoppingCartLine> cartLineList){
    2. return isNullOrEmpty(cartLineList) ? 0 : AggregateUtil.sum(cartLineList, "quantity").intValue();
    3. }

    3.2 sum(Collection<O>, String, Predicate<O>)

    说明:

    • 如果通过反射某个元素值是null,则使用默认值0代替,再进行累加示例:

    场景: 统计user list(条件是 id >10),id属性值的总和

    返回:

    当然这段代码,你还可以优化成:

    1. Predicate<Long> predicate = new ComparatorPredicate<Long>(10L, ComparatorUtils.<Long> naturalComparator(), Criterion.LESS);

    总和,计算集合对象objectCollection 内指定的属性名 propertyNames 值的总和.

    说明:

    • 如果通过反射某个元素值是null,则使用默认值0代替,再进行累加示例:**场景:** 在user list 中,分别统计 id属性以及age属性值总和
    1. User user1 = new User(2L);
    2. user1.setAge(18);
    3. User user2 = new User(3L);
    4. user2.setAge(30);
    5. Map<String, BigDecimal> map = AggregateUtil.sum(toList(user1, user2), "id", "age");
    6. LOGGER.info(JsonUtil.format(map));

    返回:

    1. {
    2. "id": 5,
    3. "age": 48
    4. }

    3.4 sum(Collection<O>, String[], Predicate<O>)

    迭代objectCollection,提取符合 includePredicate的元素的指定 propertyNames 元素的值 ,累计总和.

    示例:

    1. User user1 = new User(10L);
    2. user1.setName("刘备");
    3. user1.setAge(50);
    4. User user2 = new User(20L);
    5. user1.setName("关羽");
    6. user2.setAge(50);
    7. User user3 = new User(100L);
    8. user3.setName("张飞");
    9. user3.setAge(100);
    10. List<User> list = toList(user1, user2, user3);
    11. Map<String, BigDecimal> map = AggregateUtil.sum(list, ConvertUtil.toArray("id", "age"), new Predicate<User>(){
    12. @Override
    13. public boolean evaluate(User user){
    14. return !"张飞".equals(user.getName());
    15. }
    16. LOGGER.debug(JsonUtil.format(map));