所以我有用户输入,这是一个包含 2 个元素的列表,这 2 个元素的顺序可能会改变。如果输入类似于 ["byName", "byAge"],那么我需要首先根据名称对数据集合进行排序,如果两个元素之间存在联系,则按年龄排序。
所以如果输入是
["byName", "byAge"]
数据是
[{"John", 81},
{"Bob", 81},
{"David", 47}]
排序输出将是
[{"Bob", 81},
{"David", 47},
{"John", 81}]
同样,如果输入列表像
["byAge", "byName"]
那样颠倒,那么我会按年龄对数据进行排序,并使用名字作为决胜局。
我不确定基于输入动态选择比较器(我需要比较器,因为我需要实现其他自定义比较逻辑)的最简洁方法是什么?最明显的方法是直接检查索引 0 处存在哪个元素,即在某个 lambda 链中,如果
input.get(0) == "byAge"
然后像这样排序。但这并不是真正可扩展的,不是吗?
您可以按名称创建比较器地图:
Map<String, Comparator<Person>> comparators = new HashMap<>();
comparators.put("byName", Comparator.comparing(Person::getName));
comparators.put("byAge", Comparator.comparing(Person::getAge));
然后将它们链接起来:
List<String> input = Arrays.asList("byName", "byAge");
Comparator<Person> comparator = input.stream()
.map(comparators::get)
.reduce(Comparator::thenComparing)
.orElse((a, b) -> 0);