我想根据传入的字段(sortField)和order(sortOrder)参数对Pojos列表进行排序。我有这个工作(对于6个字段) -
switch (sortField) {
case "field1" :
if (sortOrder == "asc") {
list.sort((lItem1, lItem2) -> lItem1.getField1().compareTo(lItem2.getField1()));
} else {
list.sort((lItem1, lItem2) -> lItem2.getField1().compareTo(lItem1.getField1()));
}
break;
case "field2" :
if (sortOrder == "asc") {
list.sort((lItem1, lItem2) -> lItem1.getField2().compareTo(lItem2.getField2()));
} else {
list.sort((lItem1, lItem2) -> lItem2.getField2().compareTo(lItem1.getField2()));
}
break;
//...
}
这很有效,但感觉有点笨重,我只是想知道是否有人能指出我(相对简单!)整洁&更优雅的方式吗?
答案 0 :(得分:4)
您可以创建Map<String, Comparator<MyPojo>>
并将其用作:
Map<String, Comparator<MyPojo>> comparators = new HashMap<>();
comparators.put("field1", Comparator.comparing(MyPojo::getField1));
comparators.put("field2", Comparator.comparing(MyPojo::getField2));
//...
Comparator<MyPojo> comp = comparators.get(sortField);
list.sort("asc".equals(sortOrder) ? comp : comp.reversed());
答案 1 :(得分:2)
我认为,您可以考虑的几件事情,如可重用性和重复代码。
重复代码:
if (sortOrder == "asc")
{
list.sort((lItem1, lItem2) -> lItem1.getField2().compareTo(lItem2.getField2()));
}
else
{
list.sort((lItem1, lItem2) -> lItem2.getField2().compareTo(lItem1.getField2()));
}
要解决这个问题,我会编写两个单独的方法来分别在asc或desc中进行排序,或者编写一个方法来同时使用参数来定义排序顺序。
<强>解决方案强>
<强>例1:强>
public List sortedList(List items, boolean isOrderAscending) { //do stuffs with items based on isOrderAscending and return sorted items}
<强>例2:强>
public List sortedListInAscendingOrder(List items) { //return ascending ordered list}
public List sortedListInDescendingOrder(List items) { //return descending ordered list}
我甚至会编写一个方法来从sortOrder获取排序顺序。
public boolean isInAscending(String sortOrder) { //return true or false based on sortOrder}
编译整体:
List sortedItems = sortedList(items, isOrderAscending(sortedOrder));
也许在给出足够的想法之后,可以以更优雅的方式改变整个场地部分。