java8中的partitioningBy和groupingBy說明,以及下游收集器,斷點調試記錄peek說明

groupingBy和partitioningBy的區(qū)別
我們先來看官方源碼說明
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) {
return groupingBy(classifier, toList());
}
groupingBy的函數(shù)參數(shù)為Function然后他的返回值也是Map,但是他的key是泛型,那么這個分組就會將數(shù)據(jù)分組成多個key的形式。
我們再來看下partitioningBy
Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate) {
return partitioningBy(predicate, toList());
}
可以看出函數(shù)的參數(shù)一個Predicate接口,那么這個接口的返回值是boolean類型的,也只能是boolean類型,然后他的返回值是Map的key是boolean類型,也就是這個函數(shù)的返回值只能將數(shù)據(jù)分為兩組也就是ture和false兩組數(shù)據(jù)。
列子如下:
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);
如果要分組統(tǒng)計計數(shù),采用如下很麻煩,簡單方式如下:
采用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來格式化數(shù)據(jù)
String s2 = girls.stream().map(Girl::getName).collect(Collectors.joining(","));
final String s3 = girls.stream().map(Girl::getName).collect(Collectors.joining(", ","[","]"));

//如果我們想分組以后得到每個分組的數(shù)據(jù)呢
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統(tǒng)計收集器

采用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())

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容