1. 程式人生 > >利用Idea重構功能及Java8語法特性——優化深層巢狀程式碼

利用Idea重構功能及Java8語法特性——優化深層巢狀程式碼

當遇到深層巢狀程式碼,如for,if,lambda表示式或內部類及這些程式碼的組合,這時我們可以通過Java 8的語法特性來進行優化。

下面的程式碼是一個巢狀迴圈的示例。

public MappedField getMappedField(final String storedName) {
    for (final MappedField mf : persistenceFields) {
        for (final String n : mf.getLoadNames()) {
            if (storedName.equals(n)) {
                return mf;
            }
        }
    }
    return null;
}

重構1:

巢狀的for/if語句通暢可以通過Java 8中的stream來替代。

Optional<String> found = persistenceFields.stream()
.flatMap(mappedField -> mappedField.getLoadNames().stream())
.filter(storedName::equals)
.findFirst();

上述重構程式碼會返回Optional,但筆者希望返回mappedField物件,再次改造後的程式碼如下。

persistenceFields.stream()
.filter(mappedField -> {
    for (String name : mappedField.getLoadNames()) {
        if (storedName.equals(name)) {
            return true;
        }
    }
    return false;
}
)
.findFirst()

 

重構2: 進行更好的封裝

重構1還存在一些問題,我們需要了解mappedField的結構,並通過迴圈遍歷其所有name來找到匹配的name。根據迪米特法則(Law of Demeter ),及命令-不要去詢問法則(Tell, Don’t Ask), 下面程式碼應該由MappedField物件來提供對應的方法來判斷,而不是由呼叫者去了解MappedField結構後去寫邏輯進行判斷。

for (final MappedField mf : persistenceFields) {
    if (mf.hasName(storedName)) {
        return mf;
    }
}

因此將上述程式碼提取為MappedField類中獨立的方法,並命名為hasName。如果使用的IDE 是IDEA則可以通過refractor中的extract功能完成提取。

最後呼叫hasName方法來替代迴圈判斷邏輯。

接著通過Idea的refractor 中的move功能將程式碼移動到目標類位置。

接著通過stream來重構hasName方法,hasName方法變更為下面的形式。

public Boolean hasName(String storedName) {
    return getLoadNames().stream()
    .anyMatch(storedName::equals);
}

經過上述步驟最終重構後的程式碼為。

public MappedField getMappedField(final String storedName) {
    return persistenceFields.stream()
    .filter(mf -> mf.hasName(storedName))
    .findFirst()
    .orElse(null);
}

如需要返回Optional包裝的物件則需要去掉orElse。

public Optional<MappedField> getMappedField(final String storedName) {
    return persistenceFields.stream()
    .filter(mf -> mf.hasName(storedName))
    .findFirst();
}

 

總結

這類程式碼特徵通常為:

  • 存在深層的迴圈或條件判斷巢狀。
  • 需要通過多個getter方法來訪問物件內部資料。

重構方法:

考慮tell don’t ask原則,提供專用的方法供外部呼叫訪問資料,而不是通過使用者經過多次訪問去獲取物件資料。並通過stream提供的操作來完成重構。

 

————END————

相關推薦

利用Idea重構功能Java8語法特性——優化深層程式碼

當遇到深層巢狀程式碼,如for,if,lambda表示式或內部類及這些程式碼的組合,這時我們可以通過Java 8的語法特性來進行優化。 下面的程式碼是一個巢狀迴圈的示例。 public MappedField getMappedField(final String storedName) { for

Mongoose使用populate進行多表深層查詢功能

mongoose populate 文件欄位說明 path «Object|String» 需要做表關聯的欄位路徑,或者包含所有引數的物件 [select] «Object|String» 表關聯查詢要選擇的欄位 [model] 

IDEA 實用功能Auto Import:自動優化導包(自動刪除、匯入包)

JetBrains公司的intellij Idea堪稱JAVA程式設計界的蘋果,使用者體驗非常好下面介紹一下IDEA的一個能顯著提升寫程式碼效率的非常好用的功能設定—— Auto ImportAuto Import的功能是可以幫助我們自動刪除無用的包Import(未被引用),

C語言程式設計 實踐參考 迴圈的流程圖

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C語言程式設計 實踐參考 迴圈的流程圖

                迴圈的巢狀流程圖(1)求s=1!+2!+……10!,即求1到10的階乘和[參考解答]或者: (2)求s=1+2^2+3^3+4^4+5^5+6^6,要求n^n不能用求冪的運算直接計算(n^n表示n的n次方)[參考解答]           

java if else程式碼重構

java if else 如果巢狀很深,程式碼的易讀性差和冗餘,遇到多個判斷條件,適當提前 return,可以讓程式碼結構清晰。 我們下看一個反例,程式碼如下: public static boolean isInArea(double latitue, double l

淺析PHP7新功能語法變化總結

sign 歧義 int() rdquo cat 功能 關閉 rand reac 標量類型聲明 有兩種模式: 強制 (默認) 和 嚴格模式。 現在可以使用下列類型參數(無論用強制模式還是嚴格模式): 字符串(string), 整數 (int), 浮點數 (float),

Java精品高級課,架構課,java8特性,P2P金融項目,程序設計,功能設計,數據庫設計,第三方支付,web安全,視頻教程

數據庫設計 zfs 調優 pex 完整版 city 後臺 中間件 集群 36套精品Java架構師,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項目實戰,P2P金融項目,大型分布式電商實戰視頻教程 視頻課程包含: 高級Java架構師包含:Sp

36套精品Java高級課,架構課,java8特性,P2P金融項目,程序設計,功能設計,數據庫設計,第三方支付,web安全,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項目實戰,大型分布式電商項目實戰視頻教程

java cti 投資 調優 dubbo pac 性能 -s clas 36套精品Java高級課,架構課,java8新特性,P2P金融項目,程序設計,功能設計,數據庫設計,第三方支付,web安全,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項

java8特性,P2P金融項目,程序設計,功能設計,架構師視頻教程

orm 入門到 mongo 1.0 asf cat 身邊 last opp 36套精品Java精品高級課,架構課,java8新特性,P2P金融項目,程序設計,功能設計,數據庫設計,第三方支付,web安全,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,

Zoho Analytics讓組織機構能夠利用資料自動整合功能AI 支援的智慧助手做出更明智的商業決策

Zoho Analytics搭載豐富的第三方整合產品、時尚的使用者介面、增強的視覺化選項等等   加州普萊森頓--(美國商業資訊)--Zoho今日宣佈推出其迄今最先進的自助式商業智慧和分析平臺Zoho Analytics。新版本將發揮資料整合和人工智慧的強大威力,讓組織能夠以更高效的方

【JAVA秒會技術之Java8特性利用流快速處理集合的常見操作

例子1:對集合進行排序 List<Integer> list = Lists.newArrayList(1,1,2,2,5,3,4,6,6,5,2,7); list.sort(null); list.forEach(e -> System.out.prin

Java8特性 利用流和Lambda表示式對List集合進行處理

Lambda表示式處理List 最近在做專案的過程中經常會接觸到 lambda 表示式,隨後發現它基本上可以替代所有 for 迴圈,包括增強for迴圈。也就是我認為,絕大部分的for迴圈都可以用 lambda 表示式改寫。 lambda表示式有它自己的優點:(1)簡潔,(2)易平行計算。尤其適用於遍歷結果

Java8特性Lambda表示式的基本使用(常用功能)

Java8新特性Lambda表示式的基本使用 下面的都是基本的使用。 列表的遍歷 列表的排序 列表的篩選 列表的分頁查詢 列表內容提取 匿名類 主測試類 import java.util.Arrays; import java.util.Comp

Java8特性學習-Stream的ReduceCollect方法詳解

Stream的使用方法在http://blog.csdn.net/icarusliu/article/details/79495534一文中已經做了初步的介紹,但它的Reduce及Collect方法由於較為複雜未進行總結,現單獨對這兩個方法進行學習。 為簡化理

Java8特性探究—語法

     1. 通往lambda之路       函式式介面(也叫功能性介面)。簡單來說,函式式介面是隻包含一個方法的介面。比如Java標準庫中的Java.lang.Runnable和Java.util.Comparator都是經典的函式式介面。Java8提供@Functi

學習淘淘商城第一百零三課(利用攔截器實現登入功能訂單確認頁面展示)

        我們上節課一起搭建了訂單的服務工程和web工程,我們參考京東可以知道,京東在沒有登入時就可以使用購物車,但是當要真正付款的時候,一定是要求登入的。也就是說由購物車列表頁面直接跳轉到登入頁面去登入。這顯然用到了攔截器的功能,這節課我們便一起實現登入功能。  

利用閃回功能恢復刪除(drop,delete)的資料和表資料,update之後資料恢復

一、drop表 從 flashback table 裡查詢被刪除的資料表 1、select * from recyclebin order by droptime desc 2、執行表的恢復flashback table '需要恢復的表名' to before drop

Java8特性 1——利用流和Lambda操作集合

Java8中可以用簡潔的程式碼來操作集合,比如List,Map,他們的實現ArrayList。以此來實現Java8的充分利用CPU的目標。 流和Lambda表示式都是Java8中的新特性。流可以實現對集合的遍歷,過濾,聚合,求和以及求平均值等操作。文章力求好懂

java.io中常用的流的功能特性

IO常用流的功能及特性: 輸入流inputStream:只能從中讀取位元組資料,而不能向其寫出資料 輸出流OutputStream:只能向其寫入位元組資料,而不能從中讀取資料 輸入流inputStream: 1. dataOutputStream建立一個新的資料輸出流,將資料寫入指定基礎輸出流。 2. pr