避免java lambda中不需要的返回值
有没有办法避免此代码中的避免java lambda中不需要的返回值,java,lambda,java-8,Java,Lambda,Java 8,有没有办法避免此代码中的返回null @Test public void testFrontEndPing() throws Exception { String url = frontEndUrl("ping"); HttpGet httpGet = new HttpGet(url); httpClient.execute(httpGet, httpResponse -> { assertEquals(200, httpResponse.g
返回null
@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;
}
);
}
您尝试使用的函数接口要求函数返回一个对象。因此,无论您如何编写此功能,都必须在某些地方包含“returnnull;”
我建议您分析代码的用途,以及根据代码的设计,您是否真的希望该方法始终返回null。您可以编写如下包装器方法:
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()));
我所知道的最好的解决方案——对于你来说,一个采用func
(Response->void)
的助手方法会起作用。John Rose——嗯,void
在很多情况下应该被视为与void
相同的方法。java8 designer的想法是-@bayou.io:即使Void
被视为与Void
相同,在这种情况下,您也需要编译器将Void
推断为返回类型,而不是对象
,除非您必须使用httpClient.execute(httpGet,httpResponse->)
。所以还有更多…@Holger-如果没有返回语句,lambda主体返回void,它可以作为void“装箱”。类比-如果lambda body返回int
,并且函数需要引用类型,则会发生装箱,lambda返回类型为Integer@bayou.io:从程序员的角度来看,这是合理的,但不幸的是,编译器将在这里使用目标类型,因为lambda表达式不是显式类型(与(HttpResponse HttpResponse)相反,函数参数没有显式类型)->…
。这就有点复杂了。不过,编译器开发人员应该做那些复杂的工作,这样其他人就不必做了,这是毫无疑问的。@Holger-是的,这很复杂,但据那些java家伙说,这似乎是可行的。
应该是不必要的。null
适合每种类型,不管是什么类型编译器的推断。