2015-12-16 36 views
1

說法我試圖重構下面的代碼傳遞函數爲JDK 8

class FileDownloadResource{ 

    @Inject 
    private FileDownload fileDownload; 

    @Path(/abc) 
    public Response downloadFileABC(){ 

     try{ 
       fileDownload.downloadABC(); 

     }catch(IOException e){ 

     } 
      //Some code here that is common to the second method as well 

    } 

    @Path(/xyz) 
    public Response downloadFileXYZ(){ 

     try{ 
       fileDownload.downloadXYZ(); 

     }catch(IOException e){ 
      //handle exception 
     } 
      //Some code here that is common to the first method as well 

    } 
    } 

類是JAX-RS REST資源。正如你在上面的代碼中看到的那樣,除了try塊中的內容外,對於兩種方法來說都是一樣的。我們可以使用任何新的JDK 8 功能將fileDownload.downloadABC()作爲參數傳遞給私有方法嗎?

基本上,我正在尋找一些方法來傳遞函數 作爲參數,並讓代碼的其他部分相同。

+2

即使* try-block中的代碼是相同的。 – Andreas

+0

@Andreas修正了 – user2434

+2

是的,我的答案是這樣認爲的。 Tagir的答案與我的相似,儘管他使用功能界面的名字可能更好些,但我同時展示了使用它的ABC和XYZ版本。 – Andreas

回答

4

當然可以。您需要使用現有的功能界面或創建新界面。如您所願檢查IOException,這是更好地創建新的(你也可以使用Callable<Void>,但它是不太方便):

@FunctionalInterface 
interface IORunnable { 
    void run() throws IOException; 
} 

現在你可以創建通用請求處理程序的私有方法:

public Response handleRequest(IORunnable r){ 
    try { 
     r.run(); 
    } catch(IOException e){ 
     // handle exception 
    } 
    //Common code follows 
} 

而且使用這樣的:

@Path("/abc") 
public Response downloadFileABC(){ 
    return handleRequest(fileDownload::downloadABC); 
} 

或者與拉姆達:

@Path("/abc") 
public Response downloadFileABC(){ 
    return handleRequest(() -> fileDownload.downloadABC()); 
} 
3

你可以做到這一點,只要downloadABC()downloadXYZ()方法具有相同的參數和返回值作爲Download接口的download()方法。

界面和界面方法的名稱可以是任何你選擇的。

@FunctionalInterface 
interface DownloadMethod { 
    public void doDownload() throws IOException; 
} 

class FileDownload { 
    public void downloadABC() throws IOException {} 
    public void downloadXYZ() throws IOException {} 
} 

class FileDownloadResource{ 

    @Inject 
    private FileDownload fileDownload; 

    @Path("/abc") 
    public Response downloadFileABC(){ 
     return download(fileDownload::downloadABC); 
    } 

    @Path("/xyz") 
    public Response downloadFileXYZ() { 
     return download(fileDownload::downloadXYZ); 
    } 

    private Response download(DownloadMethod method){ 
     try{ 
      method.doDownload(); 
     }catch(IOException e){ 
      //handle exception 
     } 
     //Some code here that is common to both methods 
    } 
} 
+0

謝謝:) ...... – user2434