簡體   English   中英

使用Java 8流進行動態排序?

[英]Dynamic sorting with Java 8 stream?

長話短說,我使用JDBI DAO來訪問數據。 查詢中包含動態訂單很難。 因此,我計划在獲取查詢結果后使用Java 8流作為后處理步驟執行此操作。

問題是比較器的工作方式是必須靜態聲明對象的方法。

shepherds = shepherds.stream()
    .sorted(Comparator.comparing(Shepherd::getId).reversed())
    .collect(Collectors.toList());

我怎樣才能動態地使用這樣的變量

orderBy = id
orderDirection = ASC

這樣我可以對這個方法調用一下嗎?

例如

if(orderDirection.equals("ASC"))
    shepherds.stream().sorted(Comparator.comparing(orderBy));
else
    shepherds.stream().sorted(Comparator.comparing(orderBy).reversed());

最簡單的方法是建立一個Map (除非你真的不能在數據庫方面做到這一點,這應該是你的主要關注點), Key看起來像:

class Key {
    String field;
    Direction direction; // enum
    // getters/setters/hashcode/equals
}

只需預先創建此Map

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

另一種方法,我認為這將有可能通過真正動態創建這個LambdaMetafactory ,但它是相當復雜的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM