用Java排序pojos列表

时间:2017-04-12 11:09:37

标签: java-8

我想根据传入的字段(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;
  //...
}

这很有效,但感觉有点笨重,我只是想知道是否有人能指出我(相对简单!)整洁&更优雅的方式吗?

2 个答案:

答案 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));

也许在给出足够的想法之后,可以以更优雅的方式改变整个场地部分。