使用Java8流进行动态排序?
长话短说,我正在使用JDBIDAO访问数据。很难有一个动态顺序的查询。因此,我计划在获取查询结果后,使用Java8流作为后处理步骤来执行此操作 问题在于比较器的工作方式,它必须静态地声明对象的方法使用Java8流进行动态排序?,java,java-stream,Java,Java Stream,长话短说,我正在使用JDBIDAO访问数据。很难有一个动态顺序的查询。因此,我计划在获取查询结果后,使用Java8流作为后处理步骤来执行此操作 问题在于比较器的工作方式,它必须静态地声明对象的方法 shepherds = shepherds.stream() .sorted(Comparator.comparing(Shepherd::getId).reversed()) .collect(Collectors.toList()); 我如何用这样的变量动态地实现这一点 orde
shepherds = shepherds.stream()
.sorted(Comparator.comparing(Shepherd::getId).reversed())
.collect(Collectors.toList());
我如何用这样的变量动态地实现这一点
orderBy = id
orderDirection = ASC
这样我就可以参数化这个方法调用了
e、 g
最简单的方法可能是构建一个
映射
(除非你真的不能在DB端这样做,这应该是你的主要关注点),其中键
看起来像:
class Key {
String field;
Direction direction; // enum
// getters/setters/hashcode/equals
}
只需预先创建此地图
:
Map<Key, Comparator<Shepherd>> map = new HashMap<>();
map.put(new Key("id", Direction.ASC), Comparator.comparing(Shepard::getId))
map.put(new Key("id", Direction.DESC), Comparator.comparing(Shepard::getId).reversed())
Map Map=newhashmap();
map.put(新键(“id”,Direction.ASC),Comparator.comparing(Shepard::getId))
map.put(新键(“id”,Direction.DESC),Comparator.comparing(Shepard::getId).reversed())
另一方面,我认为通过
LambdaMetafactory
可以真正动态地创建它,但它相当复杂。因为streams没有“解决”您最初的问题,所以您最好忘记它。在数据库中进行排序,如果您无法让JDBI以这种方式进行排序,请以另一种方式进行。使用静态
访问sorter实例并不意味着您(必须)静态声明比较器。嘿,标题可能是指使用流进行排序,但实际问题是使用JDBI进行排序,这是一个解决方案。仅仅因为你不知道如何做A,并不意味着你应该对B做得很差。除了其他评论所建议的(我也建议),你可以看看这里(如果你绝对想在代码级别上排序):你应该总是在数据库中排序。不值得通过(可能)http将整个结果集流式传输到应用程序中,仅仅为了“发现”原始排序是错误的,并且只需要最后十行。这是不可伸缩的。如果只将字段存储为键,使用它检索比较器,然后如果方向是DESC,则调用比较器上的REVERSE,可能会更干净。这样,您根本不需要类键,并且可以将地图中的项目数减少一半。@AlexandruSeverin对,您也可以这样做。这里我不担心空间问题,但我仍然会创建键
类,这样检索速度就很快(O(1)
),而不需要以后进行任何额外的后处理(if/else)。但是,当然,当您使用Java 9时,您可以简单地使用Array.asList(“id”,Direction.ASC)
等,或者更好地使用List.of(“id”,Direction.ASC)
而不是键Comparator@FedericoPeraltaSchaffner对,即使我从来没有用过真正的代码,可能永远不会在需要的地方举一个例子;但这一点很好,是的
Map<Key, Comparator<Shepherd>> map = new HashMap<>();
map.put(new Key("id", Direction.ASC), Comparator.comparing(Shepard::getId))
map.put(new Key("id", Direction.DESC), Comparator.comparing(Shepard::getId).reversed())