Stream使用技巧(1)------數據處理技巧

Stream使用技巧(1)------數據處理技巧

一. 背景

做爲java8新特性之一的Stream API爲開發者帶來了極大的便利,它能夠對咱們須要操做的集合進行很是複雜的操做,以活的咱們想要的結果.java

本文不會告訴你什麼是Stream,畢竟網上花裏胡哨的使用教程已經讓我目不暇接,本系列博文只是記錄一些Stream的使用技巧,便於方便的查找和參考.api

本博文會無限更新,有新的使用方法會逐漸添加進來,若是有小夥伴有新奇的使用技巧,也能夠發出來一塊兒分享.學習

本文中默認使用的對象user以下:this

@Data
    class User {
        /** 名字 **/
        private String name;
        /** 年齡 **/
        private Integer age;
        /** 性別 true男false女 **/
        private boolean sex;

        User(String name, Integer age, boolean sex) {
            this.age = age;
            this.name = name;
            this.sex = sex;
        }
    }

二. 使用案例

1. List<User>轉Map<String, Integer>
  • 需求描述:code

    有一個List集合,其中的每個元素都是對象,想變成一個Map,其中key是對象的一個屬性,value也是對象的一個屬性或者對象自己.對象

  • 僞代碼:教程

    @Test
        public void test1() {
            User a = new User("張三", 20, true);
            User b = new User("李四", 30, true);
            User c = new User("王五", 40, true);
            List<User> list = new ArrayList<User>();
            list.add(a);
            list.add(b);
            list.add(c);
            //變成Map, key是name, value是age
            Map<String, Integer> collect = list.stream().collect(Collectors.toMap(User::getName, User::getAge));
            System.out.println(collect);
        }
  • 結果:開發

    {李四=30, 張三=20, 王五=40}

2. List<User>轉List<String>
  • 需求描述:get

    List 對象中,提取出每個User對象的name屬性,放在List裏面 博客

  • 僞代碼:

    @Test
        public void test1() {
            User a = new User("張三", 20, true);
            User b = new User("李四", 30, true);
            User c = new User("王五", 40, true);
            List<User> list = new ArrayList<User>();
            list.add(a);
            list.add(b);
            list.add(c);
            //取出每個user的name變成list
            List<String> collect = list.stream().map(User::getName).collect(Collectors.toList());
            System.out.println(collect);
        }
  • 結果:

    [張三, 李四, 王五]
3. Map<User>轉Map<Integer, Map<String, User>>
  • 需求描述

    用戶集合中的用戶,先按照年齡分組,再按照姓名分組,最終將用戶分開

  • 僞代碼:

    @Test
        public void test1() {
            User a = new User("張三", 20, true);
            User b = new User("李四", 30, true);
            User c = new User("王五", 40, true);
            User d = new User("花木蘭", 40, false);
            User e = new User("李師師", 50, false);
    
            List<User> list = new ArrayList<User>();
            list.add(a);
            list.add(b);
            list.add(c);
            list.add(d);
            list.add(e);
            //取出每個user的name變成list
            Map<Integer, Map<String, User>> collect =
                    list.stream().collect(Collectors.groupingBy(
                            User::getAge,
                            Collectors.toMap(User::getName, x -> x))
                    );
            System.out.println(collect);
        }
  • 結果:

    {50={李師師=SampleStream.User(name=李師師, age=50, sex=false)}, 20={張三=SampleStream.User(name=張三, age=20, sex=true)}, 40={王五=SampleStream.User(name=王五, age=40, sex=true), 花木蘭=SampleStream.User(name=花木蘭, age=40, sex=false)}, 30={李四=SampleStream.User(name=李四, age=30, sex=true)}}

結語:

在本篇博文中,列舉了java8中Stream API在實際開發中的一些應用技巧,記錄在這裏,之後有須要的時候能夠及時查閱

我的公衆號<橙耘自留地>日前已經開通,後續博主發佈的文章都會一併更新到公衆號,若有須要,自行查閱.

關於橙耘自留地,是我我的聚焦互聯網技術棧學習分享的一個平臺,創立之初是由於目前業內各類技術課程資料層次不齊,褒貶不一,有時候一門課花費高價買入,其實內含草包,有時偶爾低價得之,卻又大有乾貨.所以我會根據你們的意見和評價,選擇不一樣的技術棧去學習,一爲提高我本身的技術,二爲你們梳理出質量比較好的課程,以做參考.同時,相關的學習心得也會一併更新到博客和公衆號.

qrcode_for_gh_c1462e34b232_344

相關文章
相關標籤/搜索