java8中的partitioningBy和groupingBy

2019-03-15  本文已影响0人  会飞的蜗牛66666

groupingBy和partitioningBy的区别
我们先来看官方源码说明
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) {
return groupingBy(classifier, toList());
}
groupingBy的函数参数为Function然后他的返回值也是Map,但是他的key是泛型,那么这个分组就会将数据分组成多个key的形式。
我们再来看下partitioningBy
Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate) {
return partitioningBy(predicate, toList());
}
可以看出函数的参数一个Predicate接口,那么这个接口的返回值是boolean类型的,也只能是boolean类型,然后他的返回值是Map的key是boolean类型,也就是这个函数的返回值只能将数据分为两组也就是ture和false两组数据。
列子如下:
List<Girl> girls = new ArrayList();
girls.add(new Girl(20, "haha"));
girls.add(new Girl(20, "wowo"));
girls.add(new Girl(22, "hehe"));
girls.add(new Girl(21, "haha"));
girls.add(new Girl(21, "xixi"));
final Map<Integer, List<Girl>> listMap = girls.stream().collect(Collectors.groupingBy(Girl::getAge));
System.out.println(listMap);

ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();
listMap.entrySet().parallelStream().forEach(o -> map.put(o.getKey(), o.getValue().size()));
System.out.println(map);
如果要分组统计计数,采用如下很麻烦,简单方式如下:
采用counting进行收集。
Map<Integer, Long> collect = girls.stream().collect(Collectors.groupingBy(Girl::getAge, counting()));

final Map<Boolean, List<Girl>> listMap1 = girls.stream().collect(Collectors.partitioningBy(o -> o.getAge() > 20));

输出结果
{20=[Girl{age=20, name='haha'}, Girl{age=20, name='wowo'}], 21=[Girl{age=21, name='haha'}, Girl{age=21, name='xixi'}], 22=
{false=[Girl{age=20, name='haha'}, Girl{age=20, name='wowo'}], true=[Girl{age=22, name='hehe'}, Girl{age=21, name='haha'}, Girl{age=21, name='xixi'}]}

采用joining来格式化数据
String s2 = girls.stream().map(Girl::getName).collect(Collectors.joining(","));
final String s3 = girls.stream().map(Girl::getName).collect(Collectors.joining(", ","[","]"));

//如果我们想分组以后得到每个分组的数据呢
final Map<Integer, List<String>> mappingMap = girls.stream().collect(groupingBy(Girl::getAge, mapping(Girl::getName, toList())));
System.out.println(mappingMap);
结果如下:
{20=[haha, wowo], 21=[haha, xixi], 22=[hehe]}

downStream下游收集器,如上我们用到了2个下游收集器。收集器是生成最终结果的一剂配方,下游收集器则是生成部分结果的配方,主收集器中会用到下游收集器。
下游收集器还有averageingInt,平均收集器 summarizingDouble统计收集器

采用peek或者foreach记录中间结果
Map<String, DoubleSummaryStatistics> collect1 = girls.stream().peek(System.out::println).collect(groupingBy(Girl::getName, summarizingDouble(Girl::getAge)));

Comparator排序问题
personList.stream().sorted(Comparator.comparing((Person::getAge)).collect(Collectors.toList()); //按照年龄有小到大排序
personList.stream().sorted(Comparator.comparing((Person::getAge).thenComparing(Person::getId())).collect(Collectors.toList())

上一篇 下一篇

猜你喜欢

热点阅读