2017-08-04 14 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'を始める必要があると思いますか?あなたはどこでも 'sum'で分けていません。あなたは 'instants.size()'で割っています。これは0にすることができます。ユーザーがEnterキーを2回続けて押すと – Andreas

答えて

1

違いの合計が最初と最後の違いと同じであるため、ループまたはストリームは必要ありません。

にのみ、このワンライナーを必要とする:

int sum = ChronoUnit.MILLIS.between(instants.get(0), instants.get(instants.size() -1)); 
関連する問題