日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java stream group_Java8 Stream之group

發(fā)布時間:2024/9/27 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java stream group_Java8 Stream之group 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 介紹

2 Collectors的groupingBy方法

使用Java 8 提供的Stream API 可以以聲明式的方法來處理集合中的數(shù)據(jù)。靜態(tài)工廠方法 Collectors.groupingBy()和Collectors.groupingByConcurrent()提供類似SQL語言中的‘GROUP BY’的功能。兩個工廠方法用于根據(jù)某些屬性對集合中的元素分組并將分組結(jié)果存儲在Map(ConcurrentMap)中。

groupingBy方法的三個重載版本:

參數(shù)為分類函數(shù)

static Collector>> groupingBy(Function super T,? extends K> classifier)

參數(shù)為分類函數(shù)、Collector對象(執(zhí)行reduce操作)

static Collector>

groupingBy(Function super T,? extends K> classifier, Collector super T,A,D> downstream)

參數(shù)為分類函數(shù)、Supplier對象(提供Map接口的實現(xiàn),用于分類結(jié)果的存儲)和Collector對象(執(zhí)行reduce操作)

static > Collector

groupingBy(Function super T,? extends K> classifier,

Supplier mapFactory, Collector super T,A,D> downstream)

2.1 示例代碼設(shè)置

文章類型

public enum ArticleType {

NEWS,

REVIEW,

GUIDE

}

文章,包括文章標(biāo)題、作者、文章類型和文章獲得的喜歡數(shù)。

public class Article {

String title;

String author;

ArticleType type;

int likes;

}

待處理的文章列表

List articles = Arrays.asList(...);

2.2 基于單屬性分組

單屬性分組只需要一個分類函數(shù)作為參數(shù),分類函數(shù)會作用于流的所有元素,分類函數(shù)的返回值將作為分組結(jié)果的鍵。

基于作者姓名的分組如下:

Map> byAuthor = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor));

Map> byType = articles.stream()

.collect(Collectors.groupingBy(article -> article.getType()));

2.3 分組結(jié)果的鍵為復(fù)雜類型

分類函數(shù)不僅限于返回一個純量或字符串,分類結(jié)果的鍵可以是任何類型,但是要求實現(xiàn)了必要的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 修改分組結(jié)果的值類型

默認(rèn)分組結(jié)果的值類型為List,可以通過提供第二個參數(shù)來修改返回的類型。返回Set類型的示例代碼如下:

// modify the return type Map to Map

Map> authorSet = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.toSet()));

2.5 多條件分組

下面的例子,首先按照作業(yè)分組,然后對分組的結(jié)果再按照文章類型分組:

Map>> chainGroup = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.groupingBy(Article::getType)));

2.6 對分組結(jié)果執(zhí)行Reduce操作

一般分組結(jié)果的值類型為List,可以根據(jù)需要對List執(zhí)行Reduce操作,比如獲取List中某個屬性值最大最小值的元素。

計算作者文章的獲得的喜歡數(shù)的平均值:

Map averageLike = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.averagingInt(Article::getLikes)));

計算作者文章得到的喜歡數(shù)的總和:

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 獲取分組結(jié)果的統(tǒng)計數(shù)據(jù)

Stream專門提供了計算分組結(jié)果統(tǒng)計值的接口,統(tǒng)計值包括:最大值、最小值、平均值、總數(shù)、總和五個指標(biāo)。

Map summaryStatistics = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.summarizingInt(Article::getLikes)));

2.8 修改分組結(jié)果值的類型

Map modifyGroupType = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.mapping(Article::getTitle, joining("||"))));

System.out.println(modifyGroupType);

2.9 返回支持并發(fā)操作的Map

ConcurrentMap> concurrentGroup = articles.parallelStream()

.collect(Collectors.groupingByConcurrent(Article::getAuthor));

總結(jié)

以上是生活随笔為你收集整理的java stream group_Java8 Stream之group的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。