前面幾篇文章簡(jiǎn)單介紹了 Stream 的用法弦追,今天整理一下部分高級(jí)用法毕骡。
方法引用
Lambda 表達(dá)式經(jīng)常會(huì)有如下的表達(dá)式驴娃,只有一條語(yǔ)句奏候,返回某個(gè)方法的執(zhí)行結(jié)果。
string -> string.toUpperCase()
Java 8 為這種類(lèi)型的語(yǔ)句提供了一個(gè)簡(jiǎn)單的寫(xiě)法唇敞,也就是方法引用蔗草,可以重寫(xiě)為如下的方法引用。
String::toUpperCase
方法引用的標(biāo)準(zhǔn)寫(xiě)法為 ClassName::methodName疆柔,后面不需要加括號(hào)蕉世。方法引用和 lambda 表達(dá)式等價(jià),因此可以用 lambda 表達(dá)式的地方都可以用方法引用婆硬。
同樣地,構(gòu)造函數(shù)也可以使用方法引用奸例,如下的 lambda 表達(dá)式
text -> new String(text)
可以使用方法引用重寫(xiě)為
String::new
要想理解清楚方法引用彬犯,就必須明白這里是一種函數(shù)式的編程方法。使用 lambda 表達(dá)式的地方并沒(méi)有立即執(zhí)行查吊,而是在需要的時(shí)候才執(zhí)行谐区。
元素順序
元素在 Stream 中一定是有順序的,但未必與集合中的順序一致逻卖。如果是 List 集合宋列,Stream 在處理的時(shí)候會(huì)保持元素順序不變。如果是 Map评也、Set 集合炼杖,集合本身對(duì)元素的順序要求不嚴(yán)格,Stream 在處理的時(shí)候不會(huì)保證元素順序盗迟。
并行處理
現(xiàn)代計(jì)算機(jī)單核處理能力已經(jīng)很難再繼續(xù)提高坤邪,更傾向于往多核方向發(fā)展。Stream 為我們提供了利用多核計(jì)算能力的方法罚缕,可以并行處理流中的數(shù)據(jù)艇纺,提高大數(shù)據(jù)量的處理速度。
在 Stream 中邮弹,使用并行處理很簡(jiǎn)單黔衡。調(diào)用 Stream 的 parallel 方法或者集合的 parallelStream 方法可以得到一個(gè)并行處理的 Stream,其他的方法調(diào)用和操作不用改變腌乡。Stream 為我們屏蔽了并行的底層操作盟劫。
Stream<String> stream = Stream.of("a","b","c");
List<String> upperList = stream.parallel()
.map(String::toUpperCase)
.collect(Collectors.toList());
List<Integer> list = Arrays.asList(1,2,3,4,5);
List<Integer> res = list.parallelStream()
.filter(value -> value > 2)
.collect(Collectors.toList());
并行處理數(shù)組
Java 8 還為數(shù)組提供了并行處理的方法,這些方法加在 Arrays 工具類(lèi)上导饲。方法列表如下:
Arrays.parallelPrefix:任意給定一個(gè)函數(shù)捞高,計(jì)算數(shù)組的和氯材;
Arrays.parallelSetAll:使用 Lambda 表達(dá)式更新數(shù)組元素;
Arrays.parallelSort:數(shù)組排序硝岗。
下面演示一下如何使用這些方法氢哮。在下面的代碼中,先用 parallelSetAll 方法初始化數(shù)組型檀,填充隨機(jī)數(shù)冗尤;然后調(diào)用 parallelSort 方法并行排序;最后調(diào)用 parallelPrefix 方法胀溺,使用 Integer::sum 方法引用裂七,計(jì)算出數(shù)組的和。
int[] array = new int[10];
//初始化
Arrays.parallelSetAll(array, i -> new Random().nextInt(100));
System.out.println(Arrays.toString(array));
//排序
Arrays.parallelSort(array);
System.out.println(Arrays.toString(array));
//累加
Arrays.parallelPrefix(array, Integer::sum);
System.out.println(Arrays.toString(array));
上述代碼的一次運(yùn)行結(jié)果如下仓坞,填充隨機(jī)數(shù)背零、排序和求和的結(jié)果符合預(yù)期。
[77, 27, 94, 95, 11, 30, 46, 96, 45, 17]
[11, 17, 27, 30, 45, 46, 77, 94, 95, 96]
[11, 28, 55, 85, 130, 176, 253, 347, 442, 538]
每周 3 篇學(xué)習(xí)筆記或技術(shù)總結(jié)无埃,面向有一定基礎(chǔ)的 Java 程序員徙瓶,內(nèi)容涉及 Java 進(jìn)階、虛擬機(jī)嫉称、MySQL侦镇、NoSQL、分布式計(jì)算织阅、開(kāi)源框架等多個(gè)領(lǐng)域壳繁。關(guān)注作者或微信公眾號(hào) 后端開(kāi)發(fā)那點(diǎn)事兒 第一時(shí)間獲取最新內(nèi)容。