2017-08-04 36 views
-1

稍微上下文:我试图通过获取键输入时刻之间的平均差异来检测条形码扫描器信号(此模型在打印扫描值后按下输入键)。Java流间隙总和

最近我一直在寻找关于Java 8的Subramanian讨论,所以我不明白如何将此循环转换为流。

List<Instant> instants = new ArrayList<>(); 

content.addEventFilter(KeyEvent.KEY_RELEASED, e->{ 
     switch (e.getCode()) { 
      case ENTER: 
       int sum = 1;//sum starts at one to prevent division by zero failure 
       for(int i = 1 ; i < instants.size(); i++) { 
        sum+=ChronoUnit.MILLIS.between(instants.get(i), instants.get(i-1)); 
       } 
       System.out.println(sum/instants.size()); 
       //average barcode is 3 or 4 
       //my best try was about 90, it's pretty safe...i guess 
       instants.clear(); 
       break; 
      default: 
       instants.add(Instant.now()); 
       break; 
     } 
    }); 
+1

你不能把这一环成流,因为流单独处理值,这样你就可以不相邻的值进行比较。我想你*可以*写你自己的'收藏家'来做到这一点,但重点是什么? – Andreas

+1

可以说你有5个“即时”值。我们称他们为'A','B','C','D','E'。现在你总结差异:'sum =(B-A)+(C-B)+(D-C)+(E-D)'。嗯,这一切加起来就是'sum = E - A'。所有中间值彼此为空。根本不需要流式处理或循环,只需从第一个中减去最后一个值,就完成了。 – Andreas

+1

为什么你认为你需要在'1'开始'sum'以防止被零除?你不会在任何地方被“总和”除。您除以'instants.size()',可以为零,例如如果用户连续按两次ENTER。 – Andreas

回答

1

您不需要循环或流,因为差异的总和与第一个和最后一个之间的差异相同。

你只需要这一个班轮:

int sum = ChronoUnit.MILLIS.between(instants.get(0), instants.get(instants.size() -1));