-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;
}
});
ストリームが独立して値を処理するので、あなたが隣接する値を比較することはできませんので、あなたは、ストリームにそのループを翻訳することはできません。私はあなたがこれを行うために自分の「コレクター」を書くことができると思うが、何がポイントになるだろうか? – Andreas
5つの「インスタント」値があるとします。 'A'、' B'、 'C'、' D'、 'E'と呼ぶことができます。ここで、 'sum =(B-A)+(C-B)+(D-C)+(E-D)'の違いを合計します。うーん、それはすべて「sum = E-A」に加算される。すべての中間値は互いにゼロになります。ストリーミングやループを一切必要とせず、最後の値を最初の値から差し引くだけで完了です。 – Andreas
なぜゼロで除算するのを防ぐために '1'で' sum'を始める必要があると思いますか?あなたはどこでも 'sum'で分けていません。あなたは 'instants.size()'で割っています。これは0にすることができます。ユーザーがEnterキーを2回続けて押すと – Andreas