JavaRush /Java Blog /Random-TW /喝咖啡休息#89。10 個可提高您工作效率的最佳 IntelliJ IDEA 外掛程式。使用函數式介面處理 Jav...

喝咖啡休息#89。10 個可提高您工作效率的最佳 IntelliJ IDEA 外掛程式。使用函數式介面處理 Java Streams 中的異常

在 Random-TW 群組發布

10 個可提高您工作效率的最佳 IntelliJ IDEA 插件

資料來源:Hackernoon 我最近詢問使用 IntelliJ IDEA 的開發人員,他們最喜歡這個 IDE 的哪些插件?根據收集的回复,獲得了 10 個最受歡迎的擴充功能的清單。 喝咖啡休息#89。 10 個可提高您工作效率的最佳 IntelliJ IDEA 外掛程式。 使用函數式介面處理 Java 流中的異常 - 1

1. 瓦卡時間

WakaTime讓您可以查看指標、分析並追蹤程式設計所花費的時間。有了它,您將準確地知道您花了多少時間進行編碼,因為插件會自動追蹤您何時開始和停止打字,並提供專案、文件、分支、提交/PR、功能等的詳細指標。

2.步長

該插件有助於解決與技術債、維護和程式碼重構相關的問題。步長允許您:
  • 在程式碼中製作書籤;
  • 直接從編輯處追蹤技術債;
  • 建立待辦事項;
  • 在衝刺計劃期間優先考慮技術問題;
  • 在程式碼維護和重構過程中與隊友協作。

3.關鍵推動者X

Key Promotionr X可協助您了解 IntelliJ IDEA 中快捷鍵和按鈕的意思。當您將滑鼠懸停在 IDE 內的按鈕上時,Key Promotionr X 會顯示一個鍵盤快捷鍵,您可以使用該快捷鍵,而無需單擊滑鼠。

4.IntelliJ 的 ZIO

ZIO將為您提供 Scala ZIO 生態系統的建議、重構和其他改進。該插件透過以下功能擴展了 ZIO 庫:
  • 重構和建議;
  • 支援 zio 巨集(例如,@accessible);
  • 內建測試運行。

5.Protobuf

基於 IntelliJ 的 IDE 的Protobuf 語言插件提供對 Protobuf 語言的支援。Protobuf 有助於語法突出顯示、從庫和 SDK 匯入文件、導航、程式碼折疊、語義分析和快速文件。

6.SonarLint

SonarLint可讓您在程式碼問題發生之前修復它們。作為拼字檢查器,SonarLint 在您編寫程式碼時會突出顯示錯誤和安全漏洞,並提供有關如何修復它們的明確說明,以便您可以在提交程式碼之前修復它們。VS Code 中的 SonarLint 支援 Java、JavaScript、TypeScript、Python、HTML 和 PHP 中的程式碼分析。

7.ESLint

ESLint支援將 eslint 警告顯示為 IntelliJ 檢查,幫助執行多個規則的快速修復,支援自訂 eslint 規則以及 eslint 配置註解和補全。

8. 更漂亮

Prettier擴充功能可以幫助您的程式碼看起來更好並且更加一致。它透過分析程式碼並根據其規則和最大行長度重寫程式碼來確保一致的風格。

9.短尾矮袋鼠

Quokka.js是一款用於 JavaScript/TypeScript 快速原型開發的開發人員生產力工具。在 IDE 中,它會在您鍵入時更新程式碼旁的執行時間指標。這大大加快了 JavaScript/TypeScript 的原型設計、訓練和測試速度。

10. 王牌跳躍

AceJump可讓您快速將遊標移動到編輯器中可見的任何位置。只需按“CRTL+;”,輸入一個字符,然後輸入 Ace Jump 對應的字符。如果螢幕上沒有找到匹配項,AceJump 將繼續尋找它能找到的下一個匹配項。

使用函數式介面處理 Java Streams 中的異常

來源:Dev.to 喝咖啡休息#89。 10 個可提高您工作效率的最佳 IntelliJ IDEA 外掛程式。 使用函數式介面處理 Java 流中的異常 - 2我最近查看了一些程式碼,發現了這樣的東西:
subject.getIdentities().forEach(i -> {
  try {
    caseService.updateDocument(i.getCase());
  } catch (Exception e) {
    log.error(e);
  }
});
由於我是 lambda 表達式的忠實粉絲並且喜歡簡潔,因此上面的程式碼對我來說似乎有點簡潔並且有點令人困惑。要清除它,您應該使用函數式介面。為此我們需要什麼?我們知道forEach期望消費者輸入。如果我們可以將異常處理邏輯包裝在 Consumer 中,那麼我們就可以在 forEach 中使用該邏輯。forEach 內部的主要邏輯如下:
//try catch removed
// i is an Identity and updateDocument returns a UpdateResponse
i -> caseService.updateDocument(i.getCase());
我們知道輸入和傳回類型,並且可以建立一個其方法拋出異常的函數式介面。
@FunctionalInterface
public interface ThrowingFunction<Identity, UpdateResponse> {
  UpdateResponse apply(Identity i) throws Exception;
}
我們可以使用泛型使程式碼更加方便。
@FunctionalInterface
public interface ThrowingFunction<T, R> {
  R apply(T t) throws Exception;
}
建立介面後,原始邏輯就可以輸入:
ThrowingFunction<Identity, UpdateResponse> tf = i -> caseService.updateDocument(i.getCase());
現在我們有了邏輯的函數式接口,我們可以將其作為參數傳遞給處理異常並返回可在 forEach 中使用的 Consumer 的方法。
private static <T, R> Consumer<T> wrap(ThrowingFunction<T, R> f) {
  return t -> {
    try  {
      f.apply(t);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  };
}
看起來有點奇怪,但本質上,wrap 方法接受 ThrowingFunction 作為輸入,並處理函數的執行或捕獲並拋出 Consumer 中的異常。現在我們可以將任何使用的可能拋出異常的邏輯包裝在 forEach 中。它看起來像這樣:
// target type the original logic
ThrowingFunction<Identity, UpdateResponse> tf = i -> caseService.updateDocument(i.getCase()):

// pass logic to the wrapmethod
// which will execute the function or throw a RunTimeException.
Consumer<Identity> p = wrap(tf);

// use Consumer in foreach
subject.getIdentities().forEach(p);
或者,如果您更喜歡一行:
subject.getIdentities().forEach(wrap(i -> caseService.updateDocument(i.getCase())));
同意這要好得多!您可以實作類似的東西來處理不同類型的功能介面。例如,Map操作僅採用Function作為輸入。您可以使用傳回函數的方法,而不是傳回 Consumer 的包裝器方法。這只是處理線程中異常的一種方法。我應該提到的是,有些可以為您執行此操作。您也可以使用 monad 來處理成功或失敗,但這超出了本文的範圍。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION