2015-08-31 65 views
2

有沒有什麼辦法可以避免這段代碼中的return null在java lambda中避免不必要的返回值

@Test 
public void testFrontEndPing() throws Exception { 
    String url = frontEndUrl("ping"); 
    HttpGet httpGet = new HttpGet(url); 
    httpClient.execute(httpGet, httpResponse -> { 
      assertEquals(200, httpResponse.getStatusLine().getStatusCode()); 
      return null; 
     } 
    ); 
} 
+0

最好的一種解決方案,我知道 - http://bayou.io/release /0.9/javadoc/bayou/util/function/Callable_Void.html – ZhongYu

+0

對你來說,一個採用func'(Response-> void)'的幫助器方法就可以工作。 – ZhongYu

+0

John Rose - http://mail.openjdk.java.net/pipermail/lambda-dev/2013-September/011020.html – ZhongYu

回答

4

你可以寫一個包裝方法是這樣的:

static void execute(HttpClient client, HttpUriRequest request, 
        Consumer<HttpResponse> handler) { 
    client.<Void>execute(request, response -> { 
     handler.accept(response); 
     return null; 
    }); 
} 

而且使用這樣的:

execute(httpClient, httpGet, httpResponse -> 
    assertEquals(200, httpResponse.getStatusLine().getStatusCode())); 
+0

''應該是不必要的。無論編譯器推斷什麼,null都適用於每種類型。 – Holger

2

您試圖使用的功能接口強制函數返回一個對象。因此,無論您如何編寫此功能,都必須包含'return null;'

我建議你分析一下代碼是做什麼的,並且根據你的代碼設計你是否真的希望那個方法總是返回null。

+1

好吧,'void * *應該*在很多情況下都應該和'void'一樣對待案例。這是在java8設計師的腦海裏 - http://mail.openjdk.java.net/pipermail/lambda-dev/2012-November/006685.html – ZhongYu

+0

@ bayou.io:即使'Void'的處理方式與'void ',在這種情況下,您需要編譯器將'Void'推斷爲返回類型而不是'Object',除非您想使用'httpClient。 execute(httpGet,httpResponse - > ...)'。所以還有更多... – Holger

+0

@Holger - 沒有返回語句,lambda體返回void,可以將其作爲Void「裝箱」。類比 - 如果lambda體返回'int',並且該函數需要引用類型,則會發生裝箱,並且lambda返回類型爲Integer – ZhongYu