本文翻譯整理自:https://winterbe.com/posts/2015/03/05/fixing-java-8-stream-gotchas-with-intellij-ideahtml
做者:@Winterbe
歡迎關注我的微信公衆號: 小哈學Java, 文末分享阿里 P8 資深架構師吐血總結的 《Java 核心知識整理&面試.pdf》資源連接!!
我的網站: https://exception.site/java8/java8-improve-stream-byidea-tipsjava
小哈再次推薦一篇 @Winterbe 的譯文,主要是講如何經過 IntelliJ IDEA 來提高 Stream 的編碼效率,算是一個小技巧,常用 Java8 Stream 流的小夥伴們,能夠試下,可以提高工做效率哦!面試
PS: 在閱讀本文前,建議您先閱讀一下小哈的另外一篇譯文:《Java8 新特性 Stream 流教程》api
1、Java8 Stream API 的不友好性微信
2、藉助 IntelliJ IDEA 來優化一下架構
3、結語intellij-idea
Java8 自 2014 年 3 月發佈以來,已通過去不少個年頭了。在咱們公司內部,也已逐漸將全部的生產代碼遷移到這個版本。遷移中,咱們主要所作的工做就是,將代碼庫更新爲 lambda 表達式,Steam 流和新的日期 API。另外,咱們還使用 Nashorn 動態編寫那些可能在運行時須要被更改的功能。ide
除了 lambda 表達式外,最經常使用的一個功能就是新的 Stream API 了,它能夠被用來很方便地操做集合。此外,Stream 還能夠很大的提升操做集合代碼的可讀性。工具
可是,關於 Stream 流, 有一件事真的讓我很困擾!post
在使用 Stream 流時,相似reduce
和findFirst
這樣的終端操做,語義都是簡單明瞭,也很直接,咱們無需再額外傳參。
而另外一類咱們使用比較多的終端操做: collect
用起來就很繁瑣了,如咱們要轉換成 List
的時候,咱們的寫法通常是這樣的:.collect(Collectors.toList())
。
例如,下面這段代碼對字符串集合進行過濾,並轉成一個新的集合:
stringCollection .stream() .filter(e -> e.startsWith("a")) .collect(Collectors.toList());
又好比,咱們要轉換成 Set
的時候,須要寫成這樣:.collect(Collectors.toSet())
,還有 joining
和 groupingBy
之類。
在我完成對 30 萬行代碼 steam
流的遷移後,我總結了一下,toList
, toSet
和 groupingBy
是咱們項目目前最經常使用的終端操做。我沒法理解 JDK 的設計者們爲何不對 collect
方法再簡化一下,以讓它更人性化一些,好比一樣的一段代碼,爲何不設計成下面這樣:
stringCollection .stream() .filter(e -> e.startsWith("a")) .toList();
由於沒有設計成這樣,致使咱們在代碼中不得不一遍又一遍地使用 Collectors.toXXX
, 這就煩躁了。
IntelliJ IDEA 號稱宇宙最智能 Java IDE, 看看咱們如何經過它來解決這個愁人的問題。
IntelliJ IDEA 附帶了一個名爲 Live Templates
(實時模板) 的便捷功能。這是個啥玩意?即便您還不知道它是什麼, 可是你也必定常用到它。好比輸入經常使用代碼段的快捷方式 sout
,IDEA 會插入代碼段System.out.println()
。又好比,輸入 psvm
, IDEA 會快速幫您生成 main
方法等。
PS: 閱讀此處以瞭解有關它的更多信息。
哦,就這玩意?
那要怎麼經過 Live Templates
(實時模板) 來解決前面提到的痛點呢?
1.按步驟打開 File -> Setting -> Editor -> LiveTemplates:
2.新建一個 Template Group , 取名爲 Stream:
3.建立完成後,選中 Stream, 新建一個實時模板:
4.建立一個 toList
代碼片斷模板:
注意:代碼片斷的上下文選
Java -> other
.
5.設置完成後,讓咱們在實戰中看下效果吧!
除了上面演示的 toList
外, toSet
,groupingBy
和join
使用也至關廣泛,咱們也來設置一下,方法與上面大同小異,這裏就不一一貼圖了,貼上代碼片斷內容:
// 縮略: .toList .collect(Collectors.toList()); // 縮略: .toSet .collect(Collectors.toSet()); // 縮略: .join .collect(Collectors.joining("$END$")); // 縮略: .groupBy .collect(Collectors.groupingBy(e -> $END$));
PS: 特殊變量
$END$
用來在代碼片斷生成後,肯定光標位置,這樣你就能夠直接輸入相關代碼了,好比,定義join
鏈接分隔符等。
模板都建立好了之後,截圖以下:
最後,咱們再來看看,join
和 groupBy
的使用效果圖:
IntelliJ IDEA 中的實時模板是個功能豐富且強大的工具。善用它,能夠大大地提升我們的編碼效率哦。
最近在網上發現一個不錯的 PDF 資源《Java 核心知識&面試.pdf》分享給你們,不光是面試,學習,你都值得擁有!!!
獲取方式: 關注公衆號: 小哈學Java, 後臺回覆資源,既可免費無套路獲取資源連接,下面是目錄以及部分截圖:
重要的事情說兩遍,關注公衆號: 小哈學Java, 後臺回覆資源,既可免費無套路獲取資源連接 !!!