teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

いただいたコメントを参考に書き換えました。

2015/07/31 10:22

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -1,3 +1,42 @@
1
+ グルーピング化して、それぞれ計算するようにしてみるぐらいしか方法はないかなと思います。
2
+ 並列化もしているので、時間がかかる処理もマルチスレッドでよしなにやってくれるはずです。
3
+ こんな感じでいかがでしょうか?
4
+ (もうちょっとうまいか書き方はあるかもしれません)
5
+ ```Java
6
+ import java.util.stream.*;
7
+
8
+ public class SumPoint2 {
9
+ public static void main(String[] args) {
10
+ Stream<Integer> stream = Stream.of(1, 2, 3, 60, 65, 85, 90, 92, 95);
11
+ Integer sum = stream.collect(Collectors.groupingByConcurrent((n) -> {
12
+ if (n >= 90) {
13
+ return "A";
14
+ } else if (n >= 80) {
15
+ return "B";
16
+ } else if (n >= 60) {
17
+ return "C";
18
+ } else {
19
+ return "Z";
20
+ }
21
+ })).entrySet().parallelStream().mapToInt((e) -> {
22
+ switch(e.getKey()) {
23
+ case "A":
24
+ return e.getValue().stream().mapToInt(n -> 3 + (n - 90)).sum();
25
+ case "B":
26
+ return 2 * e.getValue().size();
27
+ case "C":
28
+ return e.getValue().size();
29
+ }
30
+ return 0;
31
+ }).sum();
32
+
33
+ System.out.println(sum); // => 20
34
+ }
35
+ }
36
+ ```
37
+ --------
38
+ 以下は普通にする、修正前の回答です。
39
+
1
40
  Streamを使うのであれば、処理を分岐させるのではなく、
2
41
  各ポイントにマッピングすると考えた方がいいです。
3
42
  下のような感じはいかがでしょうか?