回答編集履歴

1

回答の不具合を修正

2022/05/18 07:22

投稿

xebme
xebme

スコア1083

test CHANGED
@@ -1,6 +1,6 @@
1
- **可変長引数の型を変更する**
1
+ ~~**可変長引数の型を変更する**~~
2
2
 
3
- comparatorNullsFirstの可変長引数を`Comparator<C>...`に変更してみました。
3
+ ~~comparatorNullsFirstの可変長引数を`Comparator<C>...`に変更してみました。~~
4
4
 
5
5
  ```Java
6
6
  public static void main(String[] args) {
@@ -16,3 +16,44 @@
16
16
  .reduce((x,y) -> 0, Comparator::thenComparing);
17
17
  }
18
18
  ```
19
+ コード .map(c -> Comparator.nullsFirst(c))は、NullPointerExceptionが発生します。
20
+
21
+ ---
22
+ ### 不具合の修正
23
+ 次のように修正します。
24
+
25
+ **keyExtractorはキーごとに型が異なる可能性**
26
+ Comparator <Data>/Supplier<Comparator<Data>>を生成するstaticメソッドを用意。型変数を指定する。
27
+ - keyExtractor -> Comparator<Data>
28
+ - keyExtractor -> Supplier<Comparator<Data>>
29
+
30
+ ```Java
31
+ // nullFirstComparator
32
+ private static <C, K extends Comparable<K>> Comparator<C> getNullFirstComparator(Function<? super C, ? extends K> f) {
33
+ return Comparator.comparing(f, Comparator.nullsFirst(Comparator.naturalOrder()));
34
+ }
35
+
36
+ // Supplier<Compparator<Data>>
37
+ private static <C, K extends Comparable<K>> Supplier<Comparator<C>> getNullFirstSupplier(Function<? super C, ? extends K> f) {
38
+ return () -> Comparator.comparing(f, Comparator.nullsFirst(Comparator.naturalOrder()));
39
+ }
40
+ ```
41
+
42
+ **Comparator<Data>のリダクション**
43
+ リダクションに特化した汎用機能は、関数リテラル(ラムダ式)でもstaticメソッドでも、どちらで実装しても良い
44
+
45
+ ```Java
46
+ Comparator<Data> comparator = Stream.of(getNullFirstComparator(Data::getInteger))
47
+ .reduce(getNullFirstComparator(Data::getString),Comparator::thenComparing);
48
+
49
+ Comparator<Data> comparator = Stream.of(getNullFirstSupplier(Data::getInteger).get())
50
+ .reduce(getNullFirstSupplier(Data::getString).get(),Comparator::thenComparing);
51
+
52
+ public static <C> Comparator<C> reduceComparators_(Comparator<C> firstC, Stream<Comparator<C>> stream) {
53
+ return stream.reduce(firstC,Comparator::thenComparing);
54
+ }
55
+
56
+ public static <C> Comparator<C> reduceComparators__(Supplier<Comparator<C>> firstC, Stream<Supplier<Comparator<C>>> stream) {
57
+ return reduceComparators_(firstC.get(), stream.map(Supplier::get));
58
+ }
59
+ ```