java stream group_Java8 Stream之group
1 介紹
2 Collectors的groupingBy方法
使用Java 8 提供的Stream API 可以以聲明式的方法來處理集合中的數據。靜態工廠方法 Collectors.groupingBy()和Collectors.groupingByConcurrent()提供類似SQL語言中的‘GROUP BY’的功能。兩個工廠方法用于根據某些屬性對集合中的元素分組并將分組結果存儲在Map(ConcurrentMap)中。
groupingBy方法的三個重載版本:
參數為分類函數
static Collector>> groupingBy(Function super T,? extends K> classifier)
參數為分類函數、Collector對象(執行reduce操作)
static Collector>
groupingBy(Function super T,? extends K> classifier, Collector super T,A,D> downstream)
參數為分類函數、Supplier對象(提供Map接口的實現,用于分類結果的存儲)和Collector對象(執行reduce操作)
static > Collector
groupingBy(Function super T,? extends K> classifier,
Supplier mapFactory, Collector super T,A,D> downstream)
2.1 示例代碼設置
文章類型
public enum ArticleType {
NEWS,
REVIEW,
GUIDE
}
文章,包括文章標題、作者、文章類型和文章獲得的喜歡數。
public class Article {
String title;
String author;
ArticleType type;
int likes;
}
待處理的文章列表
List articles = Arrays.asList(...);
2.2 基于單屬性分組
單屬性分組只需要一個分類函數作為參數,分類函數會作用于流的所有元素,分類函數的返回值將作為分組結果的鍵。
基于作者姓名的分組如下:
Map> byAuthor = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor));
Map> byType = articles.stream()
.collect(Collectors.groupingBy(article -> article.getType()));
2.3 分組結果的鍵為復雜類型
分類函數不僅限于返回一個純量或字符串,分類結果的鍵可以是任何類型,但是要求實現了必要的equals和hashcode方法。
基于作者姓名和文章類型的分組如下:
Map, List> complexKeMap = articles.stream()
.collect(Collectors.groupingBy(new Function>() {
@Override
public Tuple2 apply(Article article) {
return new Tuple2<>(article.getAuthor(), article.getType());
}
}));
2.4 修改分組結果的值類型
默認分組結果的值類型為List,可以通過提供第二個參數來修改返回的類型。返回Set類型的示例代碼如下:
// modify the return type Map to Map
Map> authorSet = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor, Collectors.toSet()));
2.5 多條件分組
下面的例子,首先按照作業分組,然后對分組的結果再按照文章類型分組:
Map>> chainGroup = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor, Collectors.groupingBy(Article::getType)));
2.6 對分組結果執行Reduce操作
一般分組結果的值類型為List,可以根據需要對List執行Reduce操作,比如獲取List中某個屬性值最大最小值的元素。
計算作者文章的獲得的喜歡數的平均值:
Map averageLike = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor, Collectors.averagingInt(Article::getLikes)));
計算作者文章得到的喜歡數的總和:
Map sumLike = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor, Collectors.summingInt(Article::getLikes)));
計算每位作者最受歡迎的文章:
Map> maxLikeByAuthor = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor, Collectors.maxBy(Comparator.comparingInt(Article::getLikes))));
System.out.println(maxLikeByAuthor);
計算每位作者最不受歡迎的文章:
Map> minLikeByAuthor = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor, Collectors.minBy(Comparator.comparingInt(Article::getLikes))));
2.7 獲取分組結果的統計數據
Stream專門提供了計算分組結果統計值的接口,統計值包括:最大值、最小值、平均值、總數、總和五個指標。
Map summaryStatistics = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor, Collectors.summarizingInt(Article::getLikes)));
2.8 修改分組結果值的類型
Map modifyGroupType = articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor, Collectors.mapping(Article::getTitle, joining("||"))));
System.out.println(modifyGroupType);
2.9 返回支持并發操作的Map
ConcurrentMap> concurrentGroup = articles.parallelStream()
.collect(Collectors.groupingByConcurrent(Article::getAuthor));
總結
以上是生活随笔為你收集整理的java stream group_Java8 Stream之group的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: $1是什么币
- 下一篇: 段永平的投资金句是什么 整理如下