【发布时间】:2016-05-10 08:29:49
【问题描述】:
我正在尝试在 java8 中编写一个比较器,它依赖于使用 lambda 的两个标准。我有一个List 人。 Person 有这个方法:
Person{
String getFirstName();
String getLastName();
int getHeight();
Date getBirthday();
}
列表的排序取决于可以根据意愿选择的两个标准。因此,列表可能应该按名字和生日或名字和身高等排序。
我的方法是创建一个 switch-case 块,在其中我查看标准的不同组合。但是这种方法变得太大了。
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 几乎相同,只是方法名和类型发生了变化。这是一个非常丑陋且冗长的代码,我想以更好的方式重新设计它。
有没有办法通过使用反射来缩短这个时间?
【问题讨论】:
-
请不要为了缩短代码而引入反射。
-
为每个标准创建一个比较器,并根据所选选项提供正确的比较器。
-
第二个开关不应该打开
holder.criteria2或什么的吗? -
这是“告诉不问原则”的一个很好的例子。您不必查询条件然后决定如何排序;相反,您应该更改代码,以便“标准”知道如何排序。此外:这样的枚举开关不仅又长又丑……你应该完全避免它们。
-
@JornVernee 是的,你是对的。我编辑了我的问题。
标签: java reflection lambda comparator