【问题标题】:Dynamic order by with java with list使用带有列表的java进行动态排序
【发布时间】:2020-06-05 09:09:51
【问题描述】:

我想对我的列表进行排序(从我无法使用查询排序的数据库中获取),但我不知道哪些参数是由用户选择的。以下代码按 desc 中的名字和姓氏排序,但如何创建动态代码?我做了很多尝试,但都失败了。

myList.sort(Comparator.comparing(DTO::getName)
         .thenComparing(DTO::getLastName).reversed());

【问题讨论】:

  • 接受Comparator 作为您的方法的参数sort 并根据用户输入上定义的调用方法的构造传递它。

标签: java spring list lambda java-stream


【解决方案1】:

要根据用户参数创建自定义订单,我建议如下:

1- 创建将由用户查询中的参数填充的可能排序顺序的枚举,例如,我有 3 个订单BY_ID, BY_NAME, BY_LAST_NAME

2- 然后创建这个枚举的列表;

3- 然后创建一个映射,其中键是上面的枚举,值是比较器。

4- 填充地图。

5-从 (2) 中的订单列表和 (3) 中的地图导出一个简化的最终比较器。

6- 按最终比较器对列表进行排序。

将所有步骤放在一起

  • 排序顺序的枚举:
public enum SortOrder {
    BY_ID,
    BY_NAME,
    BY_LAST_NAME;
}
  • 主要测试方法:
public static void main(String[] args) {
         /**dummy objects for test purposes**/

            DTO firstDTO = new DTO();
            firstDTO.setId(1);
            firstDTO.setName("John");
            firstDTO.setLastName("Doe");

            DTO secondDTO = new DTO();
            secondDTO.setId(2);
            secondDTO.setName("John");
            secondDTO.setLastName("Doe");

            DTO thirdDTO = new DTO();
            thirdDTO.setId(2); // the id is repeated
            thirdDTO.setName("Alice");
            thirdDTO.setLastName("Bob");

            final List<SortOrder> sortOrders = createSortOrdersFromInputParams(/*the params passed as args*/);
            final List<DTO> myList = Arrays.asList(firstDTO, secondDTO, thirdDTO); // your list that is supposed to come from a DB
            final Map<SortOrder, Comparator<DTO>> map = new EnumMap<>(SortOrder.class);

            final Comparator<DTO> defaultComparator = Comparator.nullsLast(Comparator.comparing(DTO::getId)); // you'all always need a default comparator , say by ID

            map.put(SortOrder.BY_ID, defaultComparator);
            map.put(SortOrder.BY_NAME, Comparator.nullsLast(Comparator.comparing(DTO::getName)));
            map.put(SortOrder.BY_LAST_NAME, Comparator.nullsLast(Comparator.comparing(DTO::getLastName)));

            final Comparator<DTO> finalComparator = sortOrders.stream()
                    .map(map::get)
                    .filter(Objects::nonNull)
                    .reduce(Comparator::thenComparing)
                    .orElse(defaultComparator);

            myList.sort(finalComparator);
            System.out.println(myList);

        }
  • 将用户输入的参数转换为排序顺序的方法
    private static List<SortOrder> createSortOrdersFromInputParams(/*params passed as args*/) {
        return Arrays.asList(SortOrder.BY_ID, SortOrder.BY_NAME, SortOrder.BY_LAST_NAME);
    }

我希望这会回应你的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2013-07-09
    相关资源
    最近更新 更多