##環境
Eclipse
java8
##聞きたいこと
java8のstreamを使って、while文と同様のことを実現したい。
StreamAPIについて調べています。
そのために既存のコードをStreamで置き換えてみているのですが、その中で以下のような処理があります。
java
1 int cnt = 0; 2 int wkTotal = 0; 3 while (true) { 4 cnt++; 5 wkTotal += cnt; 6 if (wkTotal >= numX) { 7 res = cnt; 8 break; 9 } 10 }
内容は、0から数値を足していき合計がnumXを超えた時の値を取得する。というものです。
※1+2+3+4+5+ ---- +N >= numX になる初めてのNを1つ取得したい。
※numXは1から10^9の間で設定
これをStreamで書き換えられないかと試しているのですがどうもきれいになりません。
※むしろこれならwhileのままのほうがいいのではないかと思うレベルのコードです。。。
whileをStreamに置き換えるために書いてみたコード3パターン
- intstreamで実装するためにまずfor文で記述してみた
java
1 for (int i = 0;; i++) { 2 sum += i; 3 if (sum >= numX) { 4 res = i; 5 break; 6 } 7 }
- Streamのrangeをとりあえず大きくしてresumeで書いてみた
問題として、AtomicIntegerを使っており結局副作用の発生可能性から逃げられていない。途中でだしゅつしたいのだが、調べなくてはいけない最大値まで実行するので遅い。となっています。
java
1 AtomicInteger wkRes = new AtomicInteger(-1); 2 res = IntStream.range(0, 1000000000).reduce(0, (inSum, index) -> { 3 int wk = inSum + index; 4 if (wk >= numX && wkRes.intValue() == -1) { 5 wkRes.set(index); 6 } 7 return wk; 8 });
- Streamのrangeをとりあえず大きくしてresumeで書いてみた
問題として、合計値もindexも外部で持っているので上よりもひどくなっている。
java
1 AtomicInteger wkTotal2 = new AtomicInteger(0); 2 AtomicInteger wkRes2 = new AtomicInteger(-1); 3 IntStream.range(0, 200).forEach(index -> { 4 wkTotal2.addAndGet(index); 5 if (wkTotal2.intValue() >= numX && wkRes2.intValue() == -1) { 6 wkRes2.set(index); 7 return; 8 } 9 });
##聞きたいこと
- そもそもこの手の処理だとStream使わない?
- きれいな書き方
上記等ありましたらご助言いただけると嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/24 09:38