Java 为什么不能在lambda表达式中使用“break label”?有解决办法吗?
我正在尝试使用HTTPClient库实现HTTP请求的重试机制。对于重试机制,我有一个要尝试的网站列表,我将对每个网站进行Java 为什么不能在lambda表达式中使用“break label”?有解决办法吗?,java,asynchronous,lambda,httpclient,netty,Java,Asynchronous,Lambda,Httpclient,Netty,我正在尝试使用HTTPClient库实现HTTP请求的重试机制。对于重试机制,我有一个要尝试的网站列表,我将对每个网站进行重试次。当我收到来自任何请求的状态200时,该过程结束 我的想法是使用布尔值requestSuccess和标签requestLabel。当我收到状态200时,我将设置requestSuccess=true并断开requestLabel。但是,变量必须是(有效)final,并且break标签在lambda表达式中不可用 是否有任何解决办法来实现这种重试机制? boolean r
重试
次。当我收到来自任何请求的状态200
时,该过程结束
我的想法是使用布尔值requestSuccess
和标签requestLabel
。当我收到状态200
时,我将设置requestSuccess=true
并断开requestLabel
。但是,变量必须是(有效)final
,并且break
标签在lambda表达式中不可用
是否有任何解决办法来实现这种重试机制?
boolean requestSuccess = false;
requestLabel:
for(String site: sites) {
for(int i = 0; i < retries; i++) {
client.request(site, data, requestOptions, (err, res, content) -> {
if(err == null) {
requestSuccess = true;
break requestLabel;
} else {
log(...);
}
})
}
}
if(!requestSuccess) {
log("request failed");
}
boolean requestSuccess=false;
请求标签:
用于(字符串站点:站点){
for(int i=0;i{
if(err==null){
请求成功=真;
打破标签;
}否则{
对数(…);
}
})
}
}
if(!requestSuccess){
日志(“请求失败”);
}
一个可能的答案
受提交然后删除答案的启发,我可以使用包装类的解决方案。我想它会管用,但它看起来很脏
boolean[] requestSuccess = new boolean[1];
requestLabel:
for(String site: sites) {
for(int i = 0; i < retries; i++) {
if(requestSuccess[0] == true) {
break requestLabel;
}
client.request(site, data, requestOptions, (err, res, content) -> {
if(err == null) {
requestSuccess[0] = true;
} else {
log(...);
}
})
}
}
if(!requestSuccess) {
log("request failed");
}
boolean[]requestSuccess=new boolean[1];
请求标签:
用于(字符串站点:站点){
for(int i=0;i{
if(err==null){
requestSuccess[0]=true;
}否则{
对数(…);
}
})
}
}
if(!requestSuccess){
日志(“请求失败”);
}
一只羔羊在引擎盖下变成了它自己的同类。就java解释器而言,就好像有两个类一样
class Main {
public void runstuff() {
labelX:
for(...) {
client.request(new Main$Foo().xyz(.....));
}
}
class Foo {
public xyz(....) {
break labelX; // There is no labelX to break to here in Foo.xyz
}
}
}
@安迪克。如果我理解正确,如果一个请求在其中一个站点上匹配,您希望该站点处理它,对吗?在您当前的设置中,您使用的是好运方法,浪费了许多资源。如果你有20个不匹配的站点,如果你幸运的话,你有20个404。我建议你先过滤掉这些网站。然后在适当的站点上尝试该请求。您正在使用哪个http库?谢谢您的回复。代码用于反向代理,它接受请求并重新定向到另一个位置。因此,我确实希望请求在大多数情况下都能正常工作,但当它不能正常工作时,我必须重试。我想到了一个可能的答案。你能看一下吗(问题中有更新)?编译器没有抱怨。因为arr是一个数组对象,所以当我在lambda中执行
arr[0]=true时,arr
(引用)的值不会改变。嗯,true,只要数组不会改变就行了。