概要
Streamを用いたComparator
生成時、↓この実装で型推論されない理由を教えていただきたいです。
java
1Comparator<Data> comparator = Comparator 2 .comparing(d -> d.getkey1()) 3 .thenComparing(d -> d.getkey2());
(全実装は最後に記載いたします)
詳細
List<Data>
を2つのkeyでソートする処理を実装しています(key1でソート→key1が同値の場合にはkey2でソート)。
Comparator
作成時、ソース中① NG
の実装では以下内容のコンパイルエラーが発生します。
<T, U> comparing(Function<? super T,? extends U>) の型引数を推論できません
しかし、Comparator
作成Stream処理を2回に分けた、②の処理は問題なく動作します。
・なぜ①のように、2段階の処理を一度に行いComparatorを作成する実装では型推論されないのか
・なぜ、②のように2行に分けた実装ならば型推論されるのか
をご教授下さい。
java
1import java.util.ArrayList; 2import java.util.Comparator; 3import java.util.List; 4import java.util.Random; 5import java.util.stream.Collectors; 6 7public class SortTest { 8 9 public static void main(String[] args) { 10 sortTest(); 11 } 12 13 public static void sortTest() { 14 List<Data> dataList = create(); 15 16 // ① NG : なぜか型推論できない 17 Comparator<Data> comparator = Comparator 18 .comparing(d -> d.getKey1()) 19 .thenComparing(d -> d.getKey2()); 20 21 // ② OK (別々にComparator生成) 22 // Comparator<Data> comp1 = Comparator.comparing(d -> d.getKey1()); 23 // Comparator<Data> comp2 = Comparator.comparing(d -> d.getKey2()); 24 // Comparator<Data> comparator = comp1.thenComparing(comp2); 25 26 // ③ OK (型を指定すればOK) 27 // Comparator<Data> comparator = Comparator 28 // .comparing((Data d) -> d.getKey1()) 29 // .thenComparing(d -> d.getKey2()); 30 31 // ③ OK (メソッド参照でもOK) 32 // Comparator<Data> comparator = Comparator 33 // .comparing(Data::getKey1) 34 // .thenComparing(Data::getKey2); 35 36 List<Data> sortedList = dataList.stream().sorted(comparator) 37 .collect(Collectors.toList()); 38 39 showObjList(sortedList); 40 } 41 42 static class Data { 43 private final long key1; 44 private final long key2; 45 private final String str; 46 47 Data(long key1, long key2, String str) { 48 this.key1 = key1; 49 this.key2 = key2; 50 this.str = str; 51 } 52 53 public long getKey1() { 54 return this.key1; 55 } 56 57 public long getKey2() { 58 return this.key2; 59 } 60 61 public String toString() { 62 return String.valueOf(key1) 63 + " " 64 + String.valueOf(key2) 65 + " " 66 + str; 67 } 68 } 69 70 private static void showObjList(List<Data> DataList) { 71 for (Data Data : DataList) { 72 System.out.println(Data.toString()); 73 } 74 } 75 76 private static List<Data> create() { 77 List<Data> retList = new ArrayList<>(); 78 Random rnd = new Random(); 79 for (int i = 0; i < 100; i++) { 80 int key1 = rnd.nextInt(10); 81 int dc = rnd.nextInt(3); 82 String str = String.valueOf(new Random().nextInt()); 83 retList.add(new Data(key1, dc, str)); 84 } 85 return retList; 86 } 87} 88
回答2件
あなたの回答
tips
プレビュー