回答編集履歴
1
回答の不具合を修正
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
|
+
```
|