Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免java lambda中不需要的返回值_Java_Lambda_Java 8 - Fatal编程技术网

避免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
适合每种类型,不管是什么类型编译器的推断。