太讚了,Intellij IDEA竟然把Java8的數據流問題這麼完美的解決掉了!

雲棲號資訊:【點擊查看更多行業資訊
在這裏您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

自從Java8在2014年三月發佈,距離現在(2020年6月7號)快有6年了。我們打算將Pondus的所有生產服務器升級到這一新版本。從那時起,我們將大部分代碼庫遷移到lambda表達式、數據流和新的日期API上。我們也會使用Nashorn來把我們的應用中運行時發生改變的部分變成動態腳本。

除了lambda,最實用的特性是新的數據流API。集合操作在任何我見過的代碼庫中都隨處可見。而且對於那些集合操作,數據流是提升代碼可讀性的好方法。

但是一件關於數據流的事情十分令我困擾:數據流只提供了幾個終止操作,例如reduce和findFirst屬於直接操作,其它的只能通過collect來訪問。工具類Collctors提供了一些便利的收集器,例如toList、toSet、joining和groupingBy。

例如,下面的代碼對一個字符串集合進行過濾,並創建新的列表:

stringCollection
.stream()
.filter(e -> e.startsWith("a"))
.collect(Collectors.toList());

在遷移了300k行代碼到數據流之後,我可以說,toList、toSet、和groupingBy是你的項目中。所以我不能理解爲什麼不把這些方法直接集成到Stream接口上面,這樣你就可以直接編寫:

stringCollection
.stream()
.filter(e -> e.startsWith("a"))
.toList();

這在開始看起來是個小缺陷,但是如果你需要一遍又一遍地編寫這些代碼,它會非常煩人。

有toArray()方法但是沒有toList(),所以我真心希望一些便利的收集器可以在Java9中這樣添加到Stream接口中。是吧,Brian?ಠ_ಠ

注:Stream.js是瀏覽器上的Java 8 數據流API的JavaScript接口,並解決了上述問題。所有重要的終止操作都可以直接在流上訪問,十分方便。詳情請見API文檔。

無論如何,IntelliJ IDEA聲稱它是最智能的Java IDE。所以讓我們看看如何使用IDEA來解決這一問題。

使用 IntelliJ IDEA 來幫忙

IntelliJ IDEA自帶了一個便利的特性,叫做實時模板(Live Template)。如果你還不知道它是什麼:實時模板是一些常用代碼段的快捷方式。例如,你鍵入sout並按下TAB鍵,IDEA就會插入代碼段System.out.println()。更多信息請見這裏(https://www.jetbrains.com/help/idea/using-live-templates.html)。

如何用實時模板來解決上述問題?實際上我們只需要爲所有普遍使用的默認數據流收集器創建我們自己的實時模板。關注公衆號互聯網架構師,回覆關鍵字2T,獲取最新架構視頻例如,我們可以創建.toList縮寫的實時模板,來自動插入適當的收集器.collect(Collectors.toList())。

下面是它在實際工作中的樣子:

640

構建你自己的實時模板

讓我們看看如何自己構建它。首先訪問設置(Settings)並在左側的菜單中選擇實時模板。你也可以使用對話框左上角的便利的輸入過濾。

93592A1C_6792_49bb_B582_B9F4F54F1A1B

下面我們可以通過右側的+圖標創建一個新的組,叫做Stream。接下來我們向組中添加所有數據流相關的實時模板。我經常使用默認的收集器toList、toSet、groupingBy 和 join,所以我爲每個這些方法都創建了新的實時模板。

這一步非常重要。在添加新的實時模板之後,你需要在對話框底部指定合適的上下文。你需要選擇Java → Other,然後定義縮寫、描述和實際的模板代碼。

// Abbreviation: .toList
.collect(Collectors.toList())

// Abbreviation: .toSet
.collect(Collectors.toSet())

// Abbreviation: .join
.collect(Collectors.joining("$END$"))

// Abbreviation: .groupBy
.collect(Collectors.groupingBy(e -> $END$))

特殊的變量$END$指定在使用模板之後的光標位置,所以你可以直接在這個位置上打字,例如,定義連接分隔符。

提示:你應該開啓"Add unambiguous imports on the fly"(自動添加明確的導入)選項,便於讓IDEA自動添加java.util.stream.Collectors的導入語句。選項在Editor → General → Auto Import中。

讓我們在實際工作中看看這兩個模板:

1、連接

640

2、分組

640

Intellij IDEA中的實時模板非常靈活且強大。你可以用它來極大提升代碼的生產力。

你知道實時模板可以拯救生活的其它例子嗎?

仍然不滿意嗎?在我的數據流教程中學習所有你想要學到的東西。

祝編程愉快!

【雲棲號在線課堂】每天都有產品技術專家分享!
課程地址:https://yqh.aliyun.com/zhibo

立即加入社羣,與專家面對面,及時瞭解課程最新動態!
【雲棲號在線課堂 社羣】https://c.tb.cn/F3.Z8gvnK

原文發佈時間:2020-07-21
本文作者:飛龍
本文來自:“互聯網架構師”,瞭解相關信息可以關注“互聯網架構師

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章