日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java8使用Stream的缺點(diǎn)是調(diào)試?yán)щy?教你一招你就不會(huì)這么認(rèn)為了

今天給大家分享如何在 IntellJ IDEA 中調(diào)試 Java8 帶來牛逼哄哄的的新特性 Stream。

十載的西固網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整西固建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“西固網(wǎng)站設(shè)計(jì)”,“西固網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

寫在前面

Java8 API添加了一個(gè)新的抽象稱為流Stream,可以讓你以一種聲明的方式處理集合數(shù)據(jù)。Stream API可以極大提高Java程序員的生產(chǎn)力,讓我們寫出高效率、干凈、簡潔的代碼。

這種風(fēng)格將要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節(jié)點(diǎn)上進(jìn)行處理, 比如篩選, 排序,聚合等。元素流在管道中經(jīng)過中間操作(intermediate operation)的處理,最后由最終操作(terminal operation)得到前面處理的結(jié)果。

 

 
 
 
 
  1. +--------------------+       +------+   +------+   +---+   +-------+ 
  2. | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| 
  3. +--------------------+       +------+   +------+   +---+   +-------+ 

以上的流程轉(zhuǎn)換為 Java 代碼為:

 
 
 
 
  1. List transactionsIds =  
  2. widgets.stream() 
  3.              .filter(b -> b.getColor() == RED) 
  4.              .sorted((x,y) -> x.getWeight() - y.getWeight()) 
  5.              .mapToInt(Widget::getWeight) 
  6.              .sum(); 

Java 代碼這樣寫,表達(dá)的意思也很明確,書寫起來不要太流暢哦~

反正自從我們項(xiàng)目組升級到 Java8 后,一般涉及到集合遍歷、元素轉(zhuǎn)換、過濾、排序、統(tǒng)計(jì),我反手就是一個(gè) Stream。身邊同事基本上也都是這么用的,因?yàn)闀鴮懫饋韺?shí)在太流暢了,feel倍兒爽~

痛點(diǎn)

之前我面試阿里的時(shí)候,二面的面試官就問到 Java8 都有哪些新特性呢?其中我就提到了 Java8 帶來的 Stream,然后他就問缺點(diǎn)是什么?我回答寫的代碼難以調(diào)試,因?yàn)椴幌駀or循環(huán)那樣可以每一行打斷點(diǎn)調(diào)試了。

Java7中我們計(jì)算空字符串的數(shù)量可以使用如下代碼:

 
 
 
 
  1. // 計(jì)算空字符串 
  2. List strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl"); 
  3. System.out.println("列表: " + strings); 
  4. int count = 0; 
  5. for (String string : strings) { 
  6.     if (string.isEmpty()) { 
  7.         count++; 
  8.     } 
  9. return count; 

調(diào)試的時(shí)候直接在循環(huán)中打上斷點(diǎn),以Debug方式運(yùn)行,就可以跟蹤代碼的執(zhí)行流程了:

 

 

 

 

來,我們再看下Java8中的實(shí)現(xiàn)代碼:

 

 
 
 
 
  1. System.out.println("使用 Java 8: "); 
  2. count = strings.stream().filter(string -> string.isEmpty()).count(); 
  3. System.out.println("空字符串?dāng)?shù)量為: " + count); 

就一行代碼,我們需要怎么打斷點(diǎn)調(diào)試呢?

 

 

 

 

如上圖所示,在 Stream 代碼的這一行打斷點(diǎn),如果你選擇 Line ,那么就無法調(diào)試,跟蹤不到Stream在管道中傳輸以及在管道的節(jié)點(diǎn)上進(jìn)行的filter處理動(dòng)作。

選擇斷點(diǎn)加在 lambda表達(dá)式上,然后使用單步調(diào)試才可以進(jìn)入,不得不說 IDEA 是真的強(qiáng)。我印象中之前使用2019版本打斷點(diǎn)是沒有出現(xiàn)這個(gè)提示的,反正2020以上的版本肯定都有了,打斷點(diǎn)的時(shí)候就會(huì)提示選擇。

雖然可以調(diào)試,問題是可以解決了,不過還不夠強(qiáng),接下來大家別眨眼睛,一個(gè)更強(qiáng)大、更直觀的視圖,幫助我們一眼就能看出 Stream 的處理過程。

可視化追蹤 Stream 鏈

步驟還是上面的一樣,打斷點(diǎn),以Debug的方式運(yùn)行程序,區(qū)別在于打斷點(diǎn)時(shí)無需選擇是行端點(diǎn)還是lambda表達(dá)式上面,隨便選擇只要打上斷點(diǎn)即可:

 

 

 

 

 

點(diǎn)擊圖中按鈕,就會(huì)自動(dòng)打開一個(gè)Stream處理流程的視圖,整個(gè)處理過程變得一目了然,視圖分為三分部,左邊是初始集合的數(shù)據(jù),中間是Stream處理過濾后的數(shù)據(jù),右邊是最終操作得到的處理結(jié)果。

 

 

 

 

這樣Java8 Stream 相關(guān)的API( 篩選, 排序,聚合)操作就都可以可視化的展示出來了,調(diào)試時(shí)非常的方便,排查問題豈不是一眼就看到問題所在了。你說這個(gè)玩意香不香呢? 


網(wǎng)頁題目:Java8使用Stream的缺點(diǎn)是調(diào)試?yán)щy?教你一招你就不會(huì)這么認(rèn)為了
本文地址:http://m.5511xx.com/article/cdsijod.html