中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

使用 IntelliJ 調(diào)試 Java Streams

2018-11-30    來源:importnew

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用

Streams 非常強(qiáng)大,并且能夠用簡(jiǎn)單幾行代碼實(shí)現(xiàn)你所期望的功能要點(diǎn)。它們正常運(yùn)行時(shí)非常流暢優(yōu)雅,但運(yùn)行不符合預(yù)期時(shí)卻讓人苦不堪言。讓我們學(xué)習(xí)一下如何用 IntelliJ 調(diào)試你的 Java Streams 代碼,并洞察 Stream 的中間操作。

在這篇文章中,我將在例子里用到 Sakila 樣本數(shù)據(jù)庫和 Speedment Stream ORM 框架。

原理

讓我們從一個(gè)簡(jiǎn)單的 Stream 開始,我們可以在 IntelliJ 為其創(chuàng)建一個(gè)基本的 Stream debugger:

List<String> strings = Stream.of("C", "A", "B")
    .sorted()
    .collect(toList());

上面的代碼創(chuàng)建了一個(gè)由字符串 “A”、“B”、“C”組成的?Stream。緊接著對(duì)這個(gè)?Stream?進(jìn)行?sorted()?操作,從而創(chuàng)建了一個(gè)新的?Stream(至少在 Java 8-10 中是這樣),其中的元素是第一個(gè)?Stream?的元素按字母排序的結(jié)果。也就是說,第二個(gè)?Stream?包含“A”、“B”、“C”三個(gè)元素。最后,這些將元素放到一個(gè)?List?中。

上面的代碼和下面的等價(jià):

Stream<String> s0 = Stream.of("C", "B", "A"); // "C", "A", "B"
Stream<String> s1 = s0.sorted();              // "A", "B", "C"
List<String> strings = s1.collect(toList());  // [“A”, “B”, “C”]

這大體上演示了 Stream debugger 如何工作。它將一個(gè) stream 管道操作分割成多個(gè)代碼片段,一步一步地調(diào)用中間運(yùn)算操作,從而可以保留每一步操作的元素內(nèi)容以供分析。

Stream.of("C", "B", "A")
  .peek(saveStep(0))
  .sorted()
  .peek(saveStep(1))
  .collect(toList()); // The final result is saved to step 2

注意:真正的技術(shù)實(shí)現(xiàn)并不是上面這樣,它只是提供了很好的概覽。

在 IntelliJ’s debugger 中有更加形象化的表示:

它簡(jiǎn)潔明了地展示了 Stream 管道里的每個(gè)中間操作細(xì)節(jié),以及最后結(jié)果。

調(diào)用

想調(diào)用 stream debugger 的話,首先要在 Stream 定義處設(shè)置斷點(diǎn):

然后,啟動(dòng)調(diào)試會(huì)話(以 debug 模式運(yùn)行):

當(dāng)?shù)竭_(dá)斷點(diǎn)時(shí),可以按指定的按鈕(可能有些不好找)來調(diào)用 Stream debugger,下面用紅圈標(biāo)出:

這樣就打開了 stream debugger,和上文所展示的一樣。

數(shù)據(jù)庫 Streams

我將使用 Speedment(stream ORM),它允許通過標(biāo)準(zhǔn)的 Java Streams 操作來查詢數(shù)據(jù)庫,因此也能通過 IntelliJ 來調(diào)試操作?梢酝ㄟ^ Speedment initializer 來創(chuàng)建一個(gè) Speedment 項(xiàng)目。

可以通過下面方式創(chuàng)建一個(gè) Java 應(yīng)用。

Speedment app = new SakilaApplicationBuilder()
    .withPassword("sakila-password") // Replace with your own password
    .build();
FilmManager films = app.getOrThrow(FilmManager.class);

現(xiàn)在我們可以對(duì)數(shù)據(jù)庫“film”表進(jìn)行 stream 操作。下面是個(gè)例子:

List<Film> map = films.stream()
    .filter(Film.LENGTH.equal(60))
    .sorted(Film.RATING.reversed())
    .collect(toList());

代碼將從所有?Film(電影) 對(duì)象中篩選出長度為 60 分鐘的,然后通過?Film.RATING(評(píng)級(jí))對(duì)這些?Film?對(duì)象進(jìn)行排序(降序),最后將所有元素放入一個(gè)?List。

我們調(diào)用 Stream debugger 時(shí),會(huì)看到下面這張圖:

我們可以看到,初始 stream 中有 1000 部電影。篩選操作后,只剩 8 部電影,緊接著排序并放到一個(gè)?List。

計(jì)算統(tǒng)計(jì)

假設(shè)我們要計(jì)算所有 PG-13 級(jí)別(電影分級(jí)制度中的一種)電影的最小時(shí)長、最大時(shí)長以及平均時(shí)長。代碼如下:

IntSummaryStatistics stat = films.stream()
    .filter(Film.RATING.equal("PG-13"))
    .mapToInt(Film.LENGTH.asInt())
    .summaryStatistics();

Stream debugger 展示如下:

可以看出,我們可以與 Stream debugger 交互,并在 stream 管道中點(diǎn)擊元素來高亮顯示,也可以在元素間滾動(dòng)查看單個(gè)操作步驟。

Speedment 優(yōu)化了數(shù)據(jù)庫 Stream 中間操作,并將其融合進(jìn) SQL 查詢。但使用 Stream debugger 時(shí),優(yōu)化并沒有生效,以便讓我們可以看到 Stream 管道中的所有操作步驟。

結(jié)論

Stream debugger 是個(gè)隱藏的瑰寶,對(duì)于 Streams 工作有很大幫助。

我認(rèn)為這是 IntelliJ 團(tuán)隊(duì)提供的非常棒的特性。

原文鏈接: javacodegeeks 翻譯: ImportNew.com - 一杯哈希不加鹽
譯文鏈接: http://www.importnew.com/30683.html
[ 轉(zhuǎn)載請(qǐng)保留原文出處、譯者和譯文鏈接。]

關(guān)于作者: 一杯哈希不加鹽

查看一杯哈希不加鹽的更多文章 >>

標(biāo)簽: 代碼 數(shù)據(jù)庫

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:SpringBoot系列二:SpringBoot自動(dòng)配置原理

下一篇:XOR 加密簡(jiǎn)介