统计专家 - AggregateUtil JAVA开发统计少不了的,我们来看看 统计专家 - `AggregateUtil` 主要由下面几个部分组成:  ## 1.算平均. 方法 | Description :---- | :--------- **avg**(Collection<O>, String, int) | 算术平均值 **avg**(Collection<O>, String[], int) | 算术平均值 ### 1.1 avg(Collection<O>, String, int) 算术平均值. **示例:** **场景:** 求的User list 里面 id属性 的平均值 ```JAVA List<User> list = new ArrayList<>(); list.add(new User(2L)); list.add(new User(5L)); list.add(new User(5L)); AggregateUtil.avg(list, "id", 2) ``` **返回:**4.00 ### 1.2 avg(Collection<O>, String[], int) 算术平均值. **说明:** - 返回的 `LinkedHashMap`,key是 `propertyNames`的元素,value是基于这个属性名称获得的值的平均值;key的顺序是依照 propertyNames元素的顺序 **示例:** **场景:** 求的User list 里面 age 以及id属性 的平均值 ```JAVA User user1 = new User(2L); user1.setAge(18); User user2 = new User(3L); user2.setAge(30); List<User> list = toList(user1, user2); Map<String, BigDecimal> map = AggregateUtil.avg(list, ConvertUtil.toArray("id", "age"), 2); LOGGER.info(JsonUtil.format(map)); ``` **返回:** ```JSON { "id": 2.5, "age": 24 } ``` ## 2.分组求数量. 方法 | Description :---- | :--------- **groupCount**(Collection<O>, String) | 循环 objectCollection,统计 propertyName 的值出现的次数. **groupCount**(Collection<O>, String, Predicate<O>) | 循环 objectCollection,只选择符合 includePredicate的对象,统计 propertyName的值出现的次数. ### 2.1 groupCount(Collection<O>, String) 循环 `objectCollection`,统计 propertyName 的值出现的次数. **说明:** - 返回的`LinkedHashMap`,key是`propertyName`对应的值,value是该值出现的次数; - 顺序是 `objectCollection propertyName`的值的顺序 **示例:** 场景: 统计user list,属性名字是name 的值的数量 ```JAVA List<User> list = new ArrayList<>(); list.add(new User("张飞")); list.add(new User("关羽")); list.add(new User("刘备")); list.add(new User("刘备")); Map<String, Integer> map = AggregateUtil.groupCount(list, "name"); LOGGER.info(JsonUtil.format(map)); ``` **返回:** ```JSON { "张飞": 1, "关羽": 1, "刘备": 2 } ``` ### 2.2 groupCount(Collection<O>, String, Predicate<O>) 循环 `objectCollection`,只选择符合 `includePredicate`的对象,统计 `propertyName`的值出现的次数. **说明:** - 返回的`LinkedHashMap`,key是propertyName对应的值,value是该值出现的次数; - 顺序是 objectCollection propertyName的值的顺序 **示例:** **场景:** 统计user list(条件是 `age > 30` 的user),name属性值的数量 ```JAVA List<User> list = new ArrayList<>(); list.add(new User("张飞", 20)); list.add(new User("关羽", 30)); list.add(new User("刘备", 40)); list.add(new User("赵云", 50)); Map<String, Integer> map = AggregateUtil.groupCount(list, "name", new Predicate<User>(){ @Override public boolean evaluate(User user){ return user.getAge() > 30; } }); LOGGER.debug(JsonUtil.format(map)); ``` **返回:** ```JSON { "刘备": 1, "赵云": 1 } ``` ## 3.求和. 方法 | Description :---- | :--------- **sum**(Collection<O>, String) | 总和,计算集合对象`objectCollection` 内指定的属性名 `propertyName` 值的总和. **sum**(Collection<O>, String, Predicate<O>) | 迭代`objectCollection`,提取 符合 `includePredicate`的元素的指定 `propertyName` 元素的值 ,累计总和. **sum**(Collection<O>, String...) | 总和,计算集合对象`objectCollection` 内指定的属性名 `propertyNames` 值的总和. **sum**(Collection<O>, String[], Predicate<O>) | 迭代`objectCollection`,提取符合 `includePredicate`的元素的指定 `propertyNames` 元素的值 ,累计总和. ### 3.1 sum(Collection<O>, String) 总和,计算集合对象`objectCollection` 内指定的属性名 `propertyName` 值的总和. **说明:** - 如果通过反射某个元素值是null,则使用默认值0代替,再进行累加 **示例:** ```JAVA List<User> list = new ArrayList<>(); list.add(new User(2L)); list.add(new User(5L)); list.add(new User(5L)); LOGGER.info("" + AggregateUtil.sum(list, "id")); ``` **返回:**12 **说明:** 当你需要写这样的代码的时候, ```JAVA protected Integer getCookieShoppingCartLinesQty(List<CookieShoppingCartLine> cartLineList){ Integer qty = 0; //获取cookie中的购物车行集合 if (null != cartLineList && cartLineList.size() > 0){ for (Iterator iterator = cartLineList.iterator(); iterator.hasNext();){ CookieShoppingCartLine cookieShoppingCartLine = (CookieShoppingCartLine) iterator.next(); qty += cookieShoppingCartLine.getQuantity(); } } return qty; } ``` 你可以写成: ```JAVA protected Integer getCookieShoppingCartLinesQty(List<CookieShoppingCartLine> cartLineList){ return isNullOrEmpty(cartLineList) ? 0 : AggregateUtil.sum(cartLineList, "quantity").intValue(); } ``` ### 3.2 sum(Collection<O>, String, Predicate<O>) 迭代`objectCollection`,提取符合 `includePredicate`的元素的指定 `propertyName` 元素的值 ,累计总和. **说明:** - 如果通过反射某个元素值是null,则使用默认值0代替,再进行累加 **示例:** **场景:** 统计user list(条件是 `id >10`),id属性值的总和 ```JAVA List<User> list = new ArrayList<>(); list.add(new User(2L)); list.add(new User(50L)); list.add(new User(50L)); AggregateUtil.sum(list, "id", new Predicate<User>(){ @Override public boolean evaluate(User user){ return user.getId() > 10L; } }); ``` **返回:**`new BigDecimal(100L)` 当然这段代码,你还可以优化成: ```JAVA Predicate<Long> predicate = new ComparatorPredicate<Long>(10L, ComparatorUtils.<Long> naturalComparator(), Criterion.LESS); BigDecimal sum = AggregateUtil.sum(list, "id", new BeanPredicate<User>("id", predicate)); ``` ### 3.3 sum(Collection<O>, String...) 总和,计算集合对象`objectCollection` 内指定的属性名 `propertyNames` 值的总和. **说明:** - 如果通过反射某个元素值是null,则使用默认值0代替,再进行累加 **示例:** **场景:** 在user list 中,分别统计 id属性以及age属性值总和 ```JAVA User user1 = new User(2L); user1.setAge(18); User user2 = new User(3L); user2.setAge(30); Map<String, BigDecimal> map = AggregateUtil.sum(toList(user1, user2), "id", "age"); LOGGER.info(JsonUtil.format(map)); ``` **返回:** ```JSON { "id": 5, "age": 48 } ``` ### 3.4 sum(Collection<O>, String[], Predicate<O>) 迭代`objectCollection`,提取符合 `includePredicate`的元素的指定 `propertyNames` 元素的值 ,累计总和. **示例:** ```JAVA User user1 = new User(10L); user1.setName("刘备"); user1.setAge(50); User user2 = new User(20L); user1.setName("关羽"); user2.setAge(50); User user3 = new User(100L); user3.setName("张飞"); user3.setAge(100); List<User> list = toList(user1, user2, user3); Map<String, BigDecimal> map = AggregateUtil.sum(list, ConvertUtil.toArray("id", "age"), new Predicate<User>(){ @Override public boolean evaluate(User user){ return !"张飞".equals(user.getName()); } }); LOGGER.debug(JsonUtil.format(map)); ``` **返回:** ```JSON { "id": 30, "age": 100 } ```