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

回答編集履歴

2

Java8の書き方追加

2018/10/04 01:39

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -19,4 +19,14 @@
19
19
  = IntStream.rangeClosed('a', 'z')
20
20
  .map(c -> Map.entry((char)c, (int)(Math.random() * MAX + 1))
21
21
  .collect(groupingBy(e -> e.getValue(), mapping(e -> e.getKey(), toList())));
22
+ ```
23
+ Java8ならこうなるか
24
+ ```java
25
+ // import static java.util.stream.Collectors.*;
26
+ final int MAX = 10;
27
+ Map<Integer, List<Character>> map
28
+ = IntStream.rangeClosed('a', 'z')
29
+ .collect(toMap(c -> (char)c, c -> (int)(Math.random() * MAX + 1))
30
+ .entrySet().stream()
31
+ .collect(groupingBy(e -> e.getValue(), mapping(e -> e.getKey(), toList())));
22
32
  ```

1

Streamでマッピング

2018/10/04 01:39

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,3 +1,4 @@
1
+ computeIfAbsentとかgetOrDefaultとかを活用
1
2
  ```java
2
3
  final int MAX = 10;
3
4
  Random r = new Random();
@@ -9,4 +10,13 @@
9
10
  for (int i = 1; i <= MAX; i++) {
10
11
  System.out.println(map.getOrDefault(Collections.emptyList()));
11
12
  }
13
+ ```
14
+ Java9以上ならStreamでこんな書き方もできるが、ここで使っているMap.entryじゃなくても2つの値をペアにしてオブジェクトを作れればなんでもいい
15
+ ```java
16
+ // import static java.util.stream.Collectors.*;
17
+ final int MAX = 10;
18
+ Map<Integer, List<Character>> map
19
+ = IntStream.rangeClosed('a', 'z')
20
+ .map(c -> Map.entry((char)c, (int)(Math.random() * MAX + 1))
21
+ .collect(groupingBy(e -> e.getValue(), mapping(e -> e.getKey(), toList())));
12
22
  ```