我有一个列表,该列表应该定期从多个主机接收值,并对这些值进行一些操作。
List<Integer> loadList = new ArrayList<>(3);
if ((dstIp.toString().equals("10.0.0.1")
&& udp.getPayload() != null) {
loadList.add(0, intLoad1);
}
else if ((dstIp.toString().equals("10.0.0.2")
&& udp.getPayload() != null) {
loadList.add(1, intLoad2);
}
else if ((dstIp.toString().equals("10.0.0.3")
&& udp.getPayload() != null) {
loadList.add(2, intLoad3);
}
if (!loadList.isEmpty() && !loadList.contains(null)) {
int sum = loadList.stream().mapToInt(Integer::intValue).sum();
System.out.println("---- Sum: "+sum);
double averageLoad = ((double) sum) / loadList.size();
}
在我的代码中,第四个if
条件(我的意思是if (!loadList.isEmpty() && !loadList.contains(null))
)将在每次收到新值时运行,但是我正在尝试对其进行更改,以使其在每个周期(当列表中的所有三个元素都更新时)。我的意思是我希望它仅在接收到所有三个负载值时才运行(以便我可以找到新接收到的值的平均值)。
我正在寻找解决方案,但没有找到任何东西。有可能吗?
答案 0 :(得分:2)
Yo可以添加三个布尔字段,并在最后的if语句中使用它们:
boolean first = false;
boolean second= false;
boolean third = false;
List<Integer> loadList = new ArrayList<>(3);
if ((dstIp.toString().equals("10.0.0.1") && udp.getPayload() != null) {
loadList.add(0, intLoad1);
first = true;
} else if ((dstIp.toString().equals("10.0.0.2") && udp.getPayload() != null) {
loadList.add(1, intLoad2);
second = true;
} else if ((dstIp.toString().equals("10.0.0.3") && udp.getPayload() != null) {
loadList.add(2, intLoad3);
third = true;
}
if (!loadList.isEmpty() && !loadList.contains(null) && first && second && third) {
int sum = loadList.stream().mapToInt(Integer::intValue).sum();
System.out.println("---- Sum: "+sum);
double averageLoad = ((double) sum) / loadList.size();
first = false;
second= false;
third = false;
}
答案 1 :(得分:0)
使用标志:
List<Integer> loadList = new ArrayList<>(3);
boolean first = false;
boolean second = false;
boolean third = false;
if ((dstIp.toString().equals("10.0.0.1")
&& udp.getPayload() != null) {
loadList.add(0, intLoad1);
first = true;
}
else if ((dstIp.toString().equals("10.0.0.2")
&& udp.getPayload() != null) {
loadList.add(1, intLoad2);
second = true;
}
else if ((dstIp.toString().equals("10.0.0.3")
&& udp.getPayload() != null) {
loadList.add(2, intLoad3);
third = true;
}
if (!loadList.isEmpty() && !loadList.contains(null) && first && second && third) {
int sum = loadList.stream().mapToInt(Integer::intValue).sum();
System.out.println("---- Sum: "+sum);
double averageLoad = ((double) sum) / loadList.size();
first = false;
second = false;
third = false;
}
}
答案 2 :(得分:0)
您可以使用List<Future>
并将所有三个值推入该列表。
然后等待所有这些完成并进行平均。
如下所示:
List<Future<Integer>> futures= new ArrayList<>();
futures.push(1); // 2,3 as well
// now that we have all the future values
for(Future currFuture:futures) {
if(!currFuture.isDone()) currFuture.get();
}
// now perform average
int sum = 0;
for(Integer value: futures) {
sum+= value;
}
System.out.println("avg is ", sum/values.length);
由于我最近没有编写任何Java代码,语法可能会出错。请随时根据需要进行编辑