java8-Stream集合操作學習


一、Stream簡介

1、Java 8引入了全新的Stream API。這里的Stream和I/O流不同,它更像具有Iterable的集合類,但行為和集合類又有所不同。

2、stream是對集合對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作,或者大批量數據操作。

3、只要給出需要對其包含的元素執行什么操作,比如 “過濾掉長度大於 10 的字符串”、“獲取每個字符串的首字母”等,Stream 會隱式地在內部進行遍歷,做出相應的數據轉換。

二、Stream的優勢

1、函數式編程帶來的好處,我認為主要是在於使得代碼邏輯更加清晰,可讀性增強,便於維護,也更加不容易出錯。

2、使用Stream對集合的一些操作,往往代碼量只有傳統的循環遍歷的一半甚至更少。less code,less bug!

3、有逼格

三、示例數據源

public List<Map<String,Object>> list(){
Map<String,Object> map1=new HashMap<>();
map1.put("id","1");
map1.put("name","小張");
map1.put("age","10");
map1.put("sex","男");
Map<String,Object> map2=new HashMap<>();
map2.put("id","2");
map2.put("name","小李");
map2.put("age","15");
map2.put("sex","女");
Map<String,Object> map3=new HashMap<>();
map3.put("id","3");
map3.put("name","小王");
map3.put("age","30");
map3.put("sex","男");
List<Map<String,Object>> list=new ArrayList<>();
list= Arrays.asList(map1,map2,map3);
return list;
}

四、Fiter

fiter接受一個函數作為參數,該函數用lambda表達式表示。如性別為男,則會將所有性別為男的元素留下,余下的剔除。

List<Map<String,Object>> list =new test().getlist();
System.out.println(list);
List<Map<String,Object>> list2= list.stream().filter(stu->
stu.get("sex").equals("男")).collect(toList());
System.out.println(list2);

控制台輸出:

lanbda表達式中 ->右邊返回boolean類型:true 則留下,false則剔除

 public static void main(String[] args) {

        List<Map<String, Object>> list = new test().getlist();
        System.out.println(list);
        List<Map<String, Object>> list2 = list.stream().filter(stu -> {
                    if (Integer.parseInt(stu.get("age").toString()) > 20) {
                        return true;
                    } else {
                        return false;
                    }
                }
        ).collect(toList());
        System.out.println(list2);
    }

輸出:

特別注意:這里fiter操作是創建了一個新的對象的,也就是說並不會改變原list,因此必須要接一下。

五、Map

Map是將list中的元素改變,比較常用,也很好用

    public static void main(String[] args) {


        List<Map<String, Object>> list = new test().getlist();
        System.out.println(list);
        list.stream().map(stu->{
            stu.put("score",90);
            return stu;
                }
        ).collect(toList());

        System.out.println(list1);
    }

輸出:

注意一點Map方法,當返回的是原對象本身的時候,就不會創建新的List對象,也就是說原來的list會改變,正常用的時候也就不需要接了。

而如果返回的不是原對象的話,就會創建新list對象了,就需要接一下。這里也很好理解,如果這里不創建新對象的話,原來對象有泛型約束,就矛盾了啊。示例如下:

 public static void main(String[] args) {


        List<Map<String, Object>> list = new test().getlist();
        System.out.println(list);
        List<String> list1= list.stream().map(stu->{
                    return stu.get("name").toString();
                }
        ).collect(toList());

        System.out.println(list1);
    }

輸出:

 六、FlatMap

 flatMap返回參數為Stream,可以將list中的元素拆分為多個list。

    public static void main(String[] args) {
        List<Map<String, Object>> list = new test().getlist();
        System.out.println(list);
        List<String> list1= list.stream().flatMap(person->{
            String[] names= person.get("name").toString().split("-");
            return Arrays.stream(names);
        }).collect(toList());
        System.out.println(list1);
    }

輸出:

由圖可見,將list中的對象進行處理后,將整合為新的list。

七、reduce

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM