私は、ラムダの2つの基準に依存するjava8でコンパレータを記述しようとしています。私はList
人です。 Person
は、このメソッドがあります。コンパレータを複数のフィールドで短縮するには?
Person{
String getFirstName();
String getLastName();
int getHeight();
Date getBirthday();
}
リストのソートは、意思によって選択することができる2つのcriteriasに依存しています。だから、リストはファーストネームと誕生日、またはファーストネームと高さなどでソートする必要があります。
私のアプローチは、スイッチのケースブロックを作成して、さまざまな条件の組み合わせを調べることでした。しかし、このアプローチは大きくなりすぎています。
switch (holder.criteria1) {
case FIRSTNAME:
switch (holder.criteria2) {
case FIRSTNAME:
list.sort(Comparator.comparing(Person::getFirstName,
Comparator.nullsFirst(String::compareTo)));
break;
case LASTNAME:
list.sort(Comparator.comparing(Person::getFirstname,
Comparator.nullsFirst(String::compareTo)).thenComparing(
Person::getLastName, Comparator.nullsFirst(String::compareTo)));
break;
case HEIGHT:
list.sort(Comparator.comparing(Person::getFirstname,
Comparator.nullsFirst(String::compareTo)).thenComparing(
Person::getHeight, Comparator.nullsFirst(Integer::compareTo)));
break;
case BIRTHDAY:
list.sort(Comparator.comparing(Person::getFirstname,
Comparator.nullsFirst(String::compareTo)).thenComparing(
Person::getBirthday, Comparator.nullsFirst(Date::compareTo)));
break;
}
break;
すべてのケースの組み合わせでこれを繰り返す必要があります。基準2の4つのケースのうち3つはほぼ同じであり、メソッド名とタイプのみが変化します。これは非常に醜い長いコードであり、私はより良い方法でそれを再設計したいと思います。
おそらく反射を使用してこれを短縮する方法はありますか?
を単にコードを短くしようとする反射を導入しないで下さい。 – Kayaman
各基準ごとに1つのコンパレータを作成し、選択したオプションに応じて正しいコンパレータを供給します。 – aioobe
第2のスイッチが '' 'holder.criteria2'''または何かをスイッチしてはいけませんか? –