您好,登錄后才能下訂單哦!
這篇文章主要講解了“JDK8 Stream性能介紹”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“JDK8 Stream性能介紹”吧!
在編寫代碼時(shí),想用jdk8的stream替換以前的for循環(huán),代碼如下:
//for方法 Set<String> keys = Sets.newHashSetWithExpectedSize(list.size()); for (T data : list) { keys.add(getWrapRedisKey(data)); } //stream方法 Set<String> keys = list.stream().map(this::getWrapRedisKey).collect(Collectors.toSet());
stream
可以非常優(yōu)雅的一行代碼就解決,而for
則需要三行代碼,生產(chǎn)力大大提高。
但是for
循環(huán)可以實(shí)現(xiàn)初始化容量,這在頻繁add
觸發(fā)rehash
、鏈表轉(zhuǎn)紅黑樹
時(shí),能大大提高性能,那么stream
的api
的Collectors.toSet
方法有沒有設(shè)置初始化容量。
查看源碼:
Talking is cheap,show me the code
簡(jiǎn)單寫了一個(gè)測(cè)試代碼
public static void main(String[] args) { int expectSize = 100000; List<String> source = generateData(expectSize); long start = System.currentTimeMillis(); testFor(source); //testStream(source); System.out.println(System.currentTimeMillis() - start); } private static void testFor(List<String> source) { Set<String> sets = Sets.newHashSetWithExpectedSize(source.size()); for (String s : source) { sets.add(s); } } private static void testStream(List<String> source) { source.stream().collect(Collectors.toSet()); } private static List<String> generateData(int size) { List list = Lists.newArrayListWithCapacity(size); for(int i = 1; i <= size; i++) { list.add(UUIDUtils.generateId()); } return list; }
結(jié)果是10w數(shù)據(jù)是,for比stream快2-3倍...
在數(shù)據(jù)量比較大,同時(shí)要求相應(yīng)時(shí)間場(chǎng)景下,應(yīng)該還是使用for或者在使用stream前預(yù)設(shè)集合容量。
感謝各位的閱讀,以上就是“JDK8 Stream性能介紹”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)JDK8 Stream性能介紹這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。