入れ子リストをソートしなければいけない要件は少ないとは思います。
任意クラスが、Comparable を実装しているなら簡単ですがそうでなく、中の属性値でソートしなければならない時は
面倒です。
例)Item は,属性 Integer price を Not NULL で持っており、この同じ数の List 同志をソートします。
public Comparator<List<Item>> build(String name){ AtomicReference<Comparator<List<Item>>> cp = new AtomicReference<>(Comparator.comparing(u->u.get(0).getPrice())); IntStream.range(1, size).boxed().forEach(i->{ cp.set(cp.get().thenComparing(Comparator.comparing(u->u.get(i).getPrice()))); }); return cp.get(); }
こんなComparatorを生成しなければなりません。
なんとか汎用的にならないかと考えたのが、、
以下 Fieldgetter を使って、、
yipuran-core/Fieldgetter.java at master · yipuran/yipuran-core · GitHub
@SuppressWarnings({ "unchecked", "rawtypes" }) public <T> Comparator<List<T>> build(String name){ AtomicReference<Comparator<List<T>>> cp = new AtomicReference<>(Comparator.comparing(u->(Comparable)Fieldgetter.of(t->name).apply(u.get(0)))); IntStream.range(1, size).boxed().forEach(i->{ cp.set(cp.get().thenComparing( Comparator.comparing(t->(Comparable) Fieldgetter.of(e->name).apply(t.get(i))))); }); return cp.get(); }
と、属性名を指定する形で、 IntStream.range(1, size). の size は、比較する List の List のサイズです。
そこで、まとめたのが、、
yipuran-core/NestedListComparator.java at master · yipuran/yipuran-core · GitHub
ですが、
リスト同志をソートすることなんて、やはり良い設計には思えない。。。