使用Java8流进行动态排序?

使用Java8流进行动态排序?,java,java-stream,Java,Java Stream,长话短说,我正在使用JDBIDAO访问数据。很难有一个动态顺序的查询。因此,我计划在获取查询结果后,使用Java8流作为后处理步骤来执行此操作 问题在于比较器的工作方式,它必须静态地声明对象的方法 shepherds = shepherds.stream() .sorted(Comparator.comparing(Shepherd::getId).reversed()) .collect(Collectors.toList()); 我如何用这样的变量动态地实现这一点 orde

长话短说,我正在使用JDBIDAO访问数据。很难有一个动态顺序的查询。因此,我计划在获取查询结果后,使用Java8流作为后处理步骤来执行此操作

问题在于比较器的工作方式,它必须静态地声明对象的方法

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())