天天看點

java8 list 行轉列_太贊了,Intellij IDEA 竟然把 Java8 的資料流問題這麼完美的解決掉了!

  • 使用 IntelliJ IDEA 來幫忙
  • 建構你自己的實時模闆
    • 連接配接
    • 分組
  • 《Java 2019 超神之路》
  • 《Dubbo 實作原理與源碼解析 —— 精品合集》
  • 《Spring 實作原理與源碼解析 —— 精品合集》
  • 《MyBatis 實作原理與源碼解析 —— 精品合集》
  • 《Spring MVC 實作原理與源碼解析 —— 精品合集》
  • 《Spring Boot 實作原理與源碼解析 —— 精品合集》
  • 《資料庫實體設計合集》
  • 《Java 面試題 —— 精品合集》
  • 《Java 學習指南 —— 精品合集》

Java8在2014年三月釋出,距離現在(2015年三月五号)快有一年了。我們打算将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()

。更多資訊請見這裡。

如何用實時模闆來解決上述問題?實際上我們隻需要為所有普遍使用的預設資料流收集器建立我們自己的實時模闆。例如,我們可以建立

.toList

縮寫的實時模闆,來自動插入适當的收集器

.collect(Collectors.toList())

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

java8 list 行轉列_太贊了,Intellij IDEA 竟然把 Java8 的資料流問題這麼完美的解決掉了!

建構你自己的實時模闆

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

java8 list 行轉列_太贊了,Intellij IDEA 竟然把 Java8 的資料流問題這麼完美的解決掉了!

下面我們可以通過右側的

+

圖示建立一個新的組,叫做

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

中。

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

連接配接

java8 list 行轉列_太贊了,Intellij IDEA 竟然把 Java8 的資料流問題這麼完美的解決掉了!

分組

java8 list 行轉列_太贊了,Intellij IDEA 竟然把 Java8 的資料流問題這麼完美的解決掉了!

Intellij IDEA中的實時模闆非常靈活且強大。你可以用它來極大提升代碼的生産力。你知道實時模闆可以拯救生活的其它例子嗎?請讓我知道!

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

祝程式設計愉快!

來源:sf.gg/a/1190000006033999

  • 《Java 2019 超神之路》
  • 《Dubbo 實作原理與源碼解析 —— 精品合集》
  • 《Spring 實作原理與源碼解析 —— 精品合集》
  • 《MyBatis 實作原理與源碼解析 —— 精品合集》
  • 《Spring MVC 實作原理與源碼解析 —— 精品合集》
  • 《Spring Boot 實作原理與源碼解析 —— 精品合集》
  • 《資料庫實體設計合集》
  • 《Java 面試題 —— 精品合集》
  • 《Java 學習指南 —— 精品合集》

繼續閱讀