在所有三个项目都更新后的条件下运行

时间:2018-11-19 19:50:46

标签: java if-statement

我有一个列表,该列表应该定期从多个主机接收值,并对这些值进行一些操作。

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)))将在每次收到新值时运行,但是我正在尝试对其进行更改,以使其在每个周期(当列表中的所有三个元素都更新时)。我的意思是我希望它仅在接收到所有三个负载值时才运行(以便我可以找到新接收到的值的平均值)。

我正在寻找解决方案,但没有找到任何东西。有可能吗?

3 个答案:

答案 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代码,语法可能会出错。请随时根据需要进行编辑