1. 程式人生 > 其它 >Lambda表示式給map排序

Lambda表示式給map排序

技術標籤:javalambdalambdamap

封裝請求資料需要排序進行簽名,map如何排序?

  • map資料封裝
    public static void main(String[] args) {
        Map<String, String> params = new HashMap<>();
        params.put("stu_no", "123456");
        params.put("stu_name", "穎寶");
        params.put("age"
    , "18"); params.put("app_id", "1fb665aba37c437280c2c8e5cb1eff3b"); params.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); formatParamMapToString(params, false, false); method1(params); method2(params); method3(params); method4
    (params); method5(params); }
  • 藉助list方法、
 public static String formatParamMapToString(Map<String, String> paramMap, boolean urlEncode, boolean keyToLower) {
        // 原有方式排序
        try {
            List<String> paramList = new ArrayList<>();
            for (String key : paramMap.
keySet()) { paramList.add((keyToLower ? key.toLowerCase() : key) + "=" + (urlEncode ? URLEncoder.encode(paramMap.get(key), "utf-8") : paramMap.get(key))); } Collections.sort(paramList); System.out.println("原有藉助list排序paramList:" + paramList); StringBuilder beforeSign = new StringBuilder(); for (String param : paramList) { beforeSign.append(param); } return beforeSign.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; }
  • 方法1、
   private static void method1(Map<String, String> params) {
        // 自己寫的
        params = params.entrySet().stream().sorted((t1, t2) -> t1.getKey().compareTo(t2.getKey()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));
        System.out.println("自己寫的method1:" + params);
    }
  • 方法2、
  private static void method2(Map<String, String> params) {
        // key 正序
        params = params.entrySet().stream().sorted(Map.Entry.comparingByKey(Comparator.naturalOrder()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));
        System.out.println("採用函式key正序method2:" + params);
        // LinkedHashMap就是連結串列+散列表的結構,其底層採用了Linked雙向連結串列來儲存節點的訪問順序,所以保證了有序性。此處返回必須是LinkedHashMap,返回HashMap則無序。
    }

  • 方法3、
  private static void method3(Map<String, String> params) {
        // key 倒序
        params = params.entrySet().stream().sorted(Map.Entry.comparingByKey(Comparator.reverseOrder()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));
        // params.entrySet().forEach(entry -> System.out.println(String.format("%s=%s", entry.getKey(), entry.getValue())));
        System.out.println("採用函式key倒序method3:" + params);
    }
  • 方法4、
  private static void method4(Map<String, String> params) {
        // value 正序
        params = params.entrySet().stream().sorted(Map.Entry.comparingByValue()) // Comparator.naturalOrder()可以不寫,預設正序
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));
        System.out.println("採用函式value正序:" + params);

    }
  • 方法5、
 private static void method5(Map<String, String> params) {
        params = params.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));
        System.out.println("採用函式value倒序:" + params);
    }

執行結果
在這裡插入圖片描述