类似groupingBy,存在一个groupingByConcurrent收集器,可以利用到多核架构的能力。groupingByConcurrent也有3个重载的方法,与groupingBy类似。
但返回值必须是ConconcurrentHashMap或其子类。
要并发操作分组,那么stream也必须是并行的:
ConcurrentMap<BlogPostType, List<BlogPost>> postsPerType = posts.parallelStream()
.collect(groupingByConcurrent(BlogPost::getType));
注意:如果要提供一个Map供应者函数,必须保证函数返回的是ConconcurrentHashMap或其子类。
本文讨论了Java 8 Collectors API中的groupingBy收集器的几个例子。
讨论了goupingBy如何对stream中的元素基于某个属性进行分组,以及如何返回结果。
文章目录前言一、GroupingBy收集器二、使用示例2.1 准备2.2 根据单一字段分组2.3 根据Map的key的类型分组2.4 修改返回Map的value的类型2.5 修改返回自定义类型2.6 根据多个字段分组2.7 得到分组结果的平均值2.8 得到分组结果的总计2.9 得到分组结果中的最大或最小值2.10 得到分组结果中某个属性的统计2.11 把分组结果映射为另外的类型2.12 修改返回Map的类型2.13 collectingAndThen包裹一个收集器,对其结果应用转换函数3 并发的分组Coll
public static void main(String[] args) {
List<OrdersDO> list = new ArrayList<>();//查询昨天一天的所有交易
OrdersDO o1 = new OrdersDO();
o1.setAppId(1L);
o1.setTradeAmount(100L);
o1.setStatus(1);
list.add(o1);
OrdersDO o2 = new Orders.
// //groupingBy分组
// Map<Integer, Long> map = houseList.stream().collect(Collectors.groupingBy(House::getBuildId, Collectors.counting()));
// //控制台输出map
// map.forEach((k,v)->{
// System.out.println("k="+k+",v="+v);
// });
// //方.
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最
List<Person> personList = new ArrayList<>();
// 添加Person对象到personList中
Map<String, Map<Integer, List<Person>>> groupBy = personList.stream()
.collect(Collectors.groupingBy(Person::getGender,
Collectors.groupingBy(Person::getAge)));
上述代码中,首先按照性别进行分组,然后在每个性别分组中再按照年龄进行分组,最终得到一个Map对象,其中key为性别,value为另一个Map对象,其中key为年龄,value为对应的Person对象列表。
3. 如果需要对分组后的结果进行进一步处理,可以使用Stream()的map()方法,例如:
groupBy.entrySet().stream()
.map(entry -> {
String gender = entry.getKey();
Map<Integer, List<Person>> ageMap = entry.getValue();
int totalAge = ageMap.keySet().stream().mapToInt(Integer::intValue).sum();
int count = ageMap.values().stream().mapToInt(List::size).sum();
double avgAge = totalAge / (double) count;
return gender + " 总年龄:" + totalAge + " 平均年龄:" + avgAge;
.forEach(System.out::println);
上述代码中,首先遍历分组后的Map对象,然后对每个性别分组进行处理,计算出总年龄和平均年龄,并输出结果。
总之,Java8的Stream()可以方便地进行多字段分组和进一步处理,提高了代码的可读性和可维护性。