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。集合操作在任何我見過的代碼庫中都隨處可見。而且對于那些集合操作,數據流是提升代碼可讀性的好方法。

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

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

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

在遷移了300k行代碼到數據流之后,我可以說,toListtoSet、和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())

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

823ec8a8b64cbc986af85e8fd25671a7.gif

構建你自己的實時模板

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

004ac5ad49c6ba16b50d513a72b20d30.png

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

這一步非常重要。在添加新的實時模板之后,你需要在對話框底部指定合適的上下文。你需要選擇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中。

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

連接

31af4b89303ac22fdc06a0fcb04fab3f.png

分組

84cb227855553fe5dada96c5bb2415e4.png

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

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

祝編程愉快!

來源:sf.gg/a/1190000006033999

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539016.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線程run方法和start方法的區別

區別 run() 只是一個普通的方法調用,不會開啟新的線程。 start() 會開啟新的線程,分配新的資源。里面的變量互不影響。 實例 package multithreading;public class MyThread extends Thread {String flag;public MyThread(String flag) {this.flag…

字典的拼接方法

剛看到覺得很簡單 試著用 d3 dict1 dict2 就解決了 結果 報類型錯誤 后來想去遍歷 在組合越想越麻煩 下面分享幾個方法 d1 {"name":"luoyong","age":36}d2 {"class":"AID1712","start":"python"}方…

python反射、閉包、裝飾器_python 閉包裝飾器(一)

一、閉包1.舉例defouter():x 10def inner(): #內部函數print(x) #外部函數的一個變量returninner#調用inner()函數的方法outer()() #法一fouter()f()#法二注意:inner()是局部變量,在全局范圍不可調用(即不能直接調用inner()函數),但是在法二中…

java list集合自定義排序_Java 通過 Comparator comparing 對 list 自定義 排序

摘要:在日常開發中,經常會用到排序算法,這里記錄下日常使用比較多的排序方法,其中包括按指定指定:正序、倒序排序,還有按自定義字段排序的方法,方便日后查看;一:按指定字…

beautifulsoup爬取網頁中的表格_用 Python 爬取網頁

來自公眾號:優達學城Udacity作者:Kerry Parker編譯:歐剃作為數據科學家的第一個任務,就是做網頁爬取。那時候,我對使用代碼從網站上獲取數據這項技術完全一無所知,它偏偏又是最有邏輯性并且最容易獲得的數據…

Java中Runnable和Thread的區別

概述 Runnable 是接口。 Thread 是類,且實現了Runnable接口。 Thread部分源碼 public class Threadimplements Runnable {private static class Caches{static final ConcurrentMap subclassAudits new ConcurrentHashMap();static final ReferenceQueue subcla…

python 神經網絡工具_神經網絡15分鐘入門!使用python從零開始寫一個兩層神經網絡...

本篇是該系列的第三篇,建議在閱讀本篇文章之前先看前兩篇文章。在本文中將使用python實現之前描述的兩層神經網絡,并完成所提出的“象限分類”的問題。需要注意的是,雖然標題叫做神經網絡15分鐘入門,但是到這篇文章,對…

12.3目錄結構

目錄結構 設計好目錄結構 可讀性高可維護性高比如一個Foo項目Foo/--- bin/--- foo--- foo/--- tests/--- _init__.py--- test_main.py--- init.py--- main.py---doc--- conf.py---abc.rst--- setup.py--- requirement.txt--- README簡要解釋一下: bin/:存放項目的一…

pyecharts添加文字_超燃的文字云效果,用Python就能輕松get!

本文轉載自公眾號:數據森麟(ID:shujusenlin)作者:葉庭云鏈接:https://blog.csdn.net/fyfugoyfa/ 01 / 詞云圖詞云圖是一種用來展現高頻關鍵詞的可視化表達,通過文字、色彩、圖形的搭配,產生有沖擊力地視覺效…

同步關鍵詞synchronized

概述 synchronized是java中的一個關鍵字,也就是說是Java語言內置的特性。 synchronized( 一個任意的對象(鎖) ){ 代碼塊中放操作共享數據的代碼。 } public synchronized int getIndex() {return 1;}public static synchronized int getN…

python連接mysql用哪個模塊_Python連接MySQL數據庫之pymysql模塊使用

Python3連接MySQL本文介紹Python3連接MySQL的第三方庫--PyMySQL的基本使用。PyMySQL介紹PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。Django中也可以使用PyMySQL連接MySQL數據庫。PyMySQL安裝pip install pymysql連接數據…

mysql 創建視圖 主鍵_MySQL數據庫基礎操作命令,本文助你更上一層樓!

今天介紹的是關于Mysql數據庫一些操作的基礎命令用戶與權限創建用戶mysql>create user test identified by BaC321#; 修改密碼5.5版本及以前的命令mysql>set password for testpassowrd(!1A2#3); 5.6及以上命令mysql>update mysql.user set authentication_stringpass…

mysql 聚合函數 怎么用在條件里_MySql 中聚合函數增加條件表達式的方法

Mysql 與聚合函數在一起時候where條件和having條件的過濾時機where 在聚合之前過濾當一個查詢包含了聚合函數及where條件&#xff0c;像這樣的情況select max(cid) from t where t.id<999這時候會先進行過濾&#xff0c;然后再聚合。先過濾出ID《999的記錄&#xff0c;再查找…

drbd(三):drbd的狀態說明

1.幾種獲取狀態信息的方法 drbd有很多獲取信息的方式。在drbd84和之前的版本&#xff0c;大多都使用cat /proc/drbd來獲取信息&#xff0c;多數情況下&#xff0c;這個文件展示的信息對于管理和維護drbd來說已經足夠。 例如以下是drbd84上兩個volume的節點狀態信息&#xff1a;…

Lock的lock()方法

ReentrantLock是JDK唯一實現了Lock接口的類 lock() 是平常使用得最多的一個方法&#xff0c;就是用來獲取鎖。如果鎖已被其他線程獲取&#xff0c;則進行等待。 由于在前面講到如果采用Lock&#xff0c;必須主動去釋放鎖&#xff0c;并且在發生異常時&#xff0c;不會自動釋放鎖…

Lock的tryLock()方法

概述 tryLock()方法是有返回值的&#xff0c;它表示用來嘗試獲取鎖&#xff0c;如果獲取成功&#xff0c;則返回true&#xff0c;如果獲取失敗&#xff08;即鎖已被其他線程獲取&#xff09;&#xff0c;則返回false&#xff0c;這個方法無論如何都會立即返回。在拿不到鎖時不…

python requests庫詳解_python的requests庫詳解

快速上手迫不及待了嗎&#xff1f;本頁內容為如何入門 Requests 提供了很好的指引。其假設你已經安裝了 Requests。如果還沒有&#xff0c;去安裝一節看看吧。首先&#xff0c;確認一下&#xff1a;Requests 已安裝Requests 是最新的讓我們從一些簡單的示例開始吧。發送請求使用…

python QTreeWidgetItem下面有幾個子tree_python-nlp ch1筆記:nlp的基礎應用、高級應用、python優勢、nltk環境搭建...

本帖是對(印度)Jalaj Thanaki作品《python自然語言處理》的翻譯、縮減及改編~nlp的基礎應用NLP是AI的子分支&#xff0c;其相關概念可以用于以下專家系統中&#xff1a;語音識別系統問答系統機器翻譯文本摘要情感分析基于模板的聊天機器人文本分類主題分割nlp的高級應用理解自然…

C#使用ListView更新數據出現閃爍解決辦法

C#使用ListView更新數據出現閃爍解決辦法 在使用vs自動控件ListView控件時候&#xff0c;更新里面的部分代碼時候出現閃爍的情況 如圖&#xff1a; 解決以后&#xff1a; 解決辦法使用雙緩沖&#xff1a;添加新類繼承ListView 對其重寫 1 public class DoubleBufferListView : …

Lock的tryLock(long time, TimeUnit unit)方法

概述 tryLock(long time, TimeUnit unit)方法和tryLock()方法是類似的&#xff0c;只不過區別在于這個方法在拿不到鎖時會等待一定的時間&#xff0c;在時間期限之內如果還拿不到鎖&#xff0c;就返回false。如果一開始拿到鎖或者在等待期間內拿到了鎖&#xff0c;則返回true。…