回答編集履歴
1
いただいたコメントを参考に書き換えました。
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
|
下のような感じはいかがでしょうか?
|