Java利用stream(流)对map中的values进行过滤、排序操作
生活随笔
收集整理的這篇文章主要介紹了
Java利用stream(流)对map中的values进行过滤、排序操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
對于Java8中的stream(流)這種優雅、方便、快捷、高效的操作已經是信手沾來了吧,但是卻僅限List、Set。難道我Map不要面子得嘛?在工作中需要對從List轉Map的數據進行操作,因此便有這隨筆。
新建一個User類,注意下面使用lombok;如果你是idea請下載相關插件以及依賴,我這里使用maven引,在這里不多詳細說明了。
Copy/*** @program: strategy-demo* @description: stream操作* @author: YuAoTian* @create: 2020-01-06 23:23**/ @Data @AllArgsConstructor class User{private Integer id;private String name;private String city;private Integer age; }繼續看代碼,看Main方法里面的
Copy public static void main(String[] args) {List<User> userList = Arrays.asList(new User((int) (Math.random()*10),"小明","北京",18),new User((int) (Math.random()*10),"小紅", "南京", 17),new User((int) (Math.random()*10),"小丫", "湖北", 14),new User((int) (Math.random()*10),"小黑", "深圳", 22),new User((int) (Math.random()*10),"小玉", "廣州", 19),new User((int) (Math.random()*10),"小小", "江西", 21));Map<Integer, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getId));//已ID作為Key}Map排序
正排
CopyMap<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> o.getValue().get(0).getAge())).map(entry -> {Map<Integer, List<User>> result = new LinkedHashMap<>();result.put(entry.getKey(), entry.getValue());return result;}).reduce((map1, map2) -> {map2.forEach(map1::put);return map1;}).get();System.out.print(map);輸出
Copy{5=[User(id=5, name=小丫, city=湖北, age=14), User(id=5, name=小玉, city=廣州, age=19), User(id=5, name=小小, city=江西, age=21)], 0=[User(id=0, name=小紅, city=南京, age=17)], 8=[User(id=8, name=小明, city=北京, age=18)], 9=[User(id=9, name=小黑, city=深圳, age=22)]}倒排
Copy Map<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {//倒排中 reversed() 方法 是object 對象,需要在里面強制回 Entry 就行。Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;return temp.getValue().get(0).getAge();}).reversed()).map(entry -> {Map<Integer, List<User>> result = new LinkedHashMap<>();result.put(entry.getKey(), entry.getValue());return result;}).reduce((map1, map2) -> {map2.forEach(map1::put);return map1;}).get();System.out.print(map);輸出
Copy{3=[User(id=3, name=小黑, city=深圳, age=22)], 5=[User(id=5, name=小玉, city=廣州, age=19)], 0=[User(id=0, name=小明, city=北京, age=18), User(id=0, name=小丫, city=湖北, age=14)], 2=[User(id=2, name=小紅, city=南京, age=17), User(id=2, name=小小, city=江西, age=21)]}以上是對年齡進行從小到大和從大到小的排序,并且最后返回的是一個Optional,如果不懂的可以接下來看一些例子。
CopyOptional<Map<Integer, List<User>>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {//倒排中 reversed() 方法 是object 對象,需要在里面強制回 Entry 就行。Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;return temp.getValue().get(0).getAge();}).reversed()).map(entry -> {Map<Integer, List<User>> result = new LinkedHashMap<>();result.put(entry.getKey(), entry.getValue());return result;}).reduce((map1, map2) -> {map2.forEach(map1::put);return map1;});//為null返回false,否則true,即可調用get()返回~if(map.isPresent()){Map<Integer, List<User>> listMap = map.get();//調用get()返回一個Map}System.out.print(map);優化
CopyMap<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {//倒排中 reversed() 方法 是object 對象,需要在里面強制回 Entry 就行。Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;return temp.getValue().get(0).getAge();}).reversed()).collect(LinkedHashMap::new,(m,e) -> m.put(e.getKey(),e.getValue()),LinkedHashMap::putAll);是不是瞬間感覺世界清靜了很多~你還可以處理一下一些縮進,能把他縮到一行!
Map過濾
Copymap.entrySet().stream().filter(entry -> entry.getValue().get(0).getAge() > 16) .collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), LinkedHashMap::putAll);System.out.println(map);輸出
Copy{1=[User(id=1, name=小丫, city=湖北, age=14)]}過濾掉年齡<16的,過濾非常簡單我就不提供其他例子了;一個filter然后直接collect就行了~
本文也就到此結束,如果有更好的方法望告知~
總結
以上是生活随笔為你收集整理的Java利用stream(流)对map中的values进行过滤、排序操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基因分子生物学(2)-DNA携带遗传特性
- 下一篇: 分子生物学之蛋白质概述