Java8-2-Lambda表達式實戰-一句話實現Map中按照Value排序

今天咱們來實戰一把, 對Map的Value值排序進行簡化.程序員

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:854630135,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。分佈式

在之前的思路咱們的作法以下:ide

 
/** * * Map根據value排序; * * @param map * @return */ public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<K, V>>() { @Override public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { return (o2.getValue()).compareTo(o1.getValue()); } }); Map<K, V> result = new LinkedHashMap<>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; }

什麼意思呢?意思就是先把Map變成可排序的List使用Comparator接口對entry進行排序, 但是這樣代碼不少很亂, 咱們須要作一些簡化.微服務

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:854630135,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。工具

第一步: 使用Lambda表達式先對Comparator接口作簡化, 代碼會變成以下狀況:源碼分析

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); list.sort(Comparator.comparing(Entry::getValue)); Map<K, V> result = new LinkedHashMap<>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; }

這樣的話, 一行代碼就代替了五行, 可是會有個問題, 這樣寫只能從小到大排序很不靈活, 咱們還有其餘辦法.來看下面的代碼:性能

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); list.sort((o1, o2)-> o2.getValue().compareTo(o1.getValue())); Map<K, V> result = new LinkedHashMap<>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; }

用lambda表達式就能夠作到變換排序的方式, 只要改變o1和o2的順序就能夠了.哎, 能夠仍是很長, 我還想再少幾句代碼, 怎麼辦?學習

咱們來分析下最原始的排序代碼 ---> 首先是將Map轉化爲List<Entry>利用List的可排序的特性排序後遍歷到新的Map裏面去, 這樣就很簡單了, 咱們能夠從遍歷的地方入手.代碼以下:code

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); list.sort((o1, o2)-> o2.getValue().compareTo(o1.getValue())); Map<K, V> result = new LinkedHashMap<>(); list.stream().forEach(entry -> result.put(entry.getKey(), entry.getValue())); return result; }

也許作到上面這一步已經很知足了, 但是做爲一個優秀的開發人員怎麼能知足於這種程度, 咱們要用兩句話完成上面的功能.咱們能夠發現entrySet()是個集合, stream是有sort方法的, 能夠set變成stream而後sort以後forEach到新的Map中, 牛逼吧, 廢話少說,看代碼.視頻

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { Map<K, V> sortMap = new LinkedHashMap<>(); new map.entrySet().stream() .sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())) .forEach(entry -> sortMap.put(entry.getKey(), entry.getValue())); return sortMap; }

高級程序員到這裏就能夠了, 下面提供一個工具類給你們使用.

 
/** * flag = 1 正序 * flag = 0 倒序 * @param map * @param flag * @return */ public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map, int flag) { Map<K, V> sortMap = new LinkedHashMap<>(); if(flag == 1) { map.entrySet().stream() .sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue())) .forEach(entry -> sortMap.put(entry.getKey(), entry.getValue())); } else { map.entrySet().stream() .sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())) .forEach(entry -> sortMap.put(entry.getKey(), entry.getValue())); } return sortMap; }

以上的代碼已經夠簡潔了, 可是有一箇中間變量, 我做爲一個究極程序員是看不慣的, 能不能把它也省略掉一句代碼實現整個功能呢? 答案是能夠的.

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:854630135,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue2(Map<K, V> map, int flag) { if(flag == 1) { return map.entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue())).map(entry -> { Map<K, V> result = new LinkedHashMap<>(); result.put(entry.getKey(), entry.getValue()); return result; }).reduce((map1, map2) -> { map2.entrySet().forEach(entry -> map1.put(entry.getKey(), entry.getValue())); return map1; }).get(); } else { return map.entrySet().stream().sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())).map(entry -> { Map<K, V> result = new LinkedHashMap<>(); result.put(entry.getKey(), entry.getValue()); return result; }).reduce((map1, map2) -> { map2.entrySet().forEach(entry -> map1.put(entry.getKey(), entry.getValue())); return map1; }).get(); }

思路是作好排序後將排序後的entry加入到新的Map裏面, 再將stream<Map<K,V>>進行疊加, 可能有些抽象, 不能明白的也只能幫到這啦.

相關文章
相關標籤/搜索