天天看點

Stream流終結操作方法、收集操作及Stream綜合練習

目錄

​​一、Stream流終結操作方法​​

​​二、Stream流的收集操作​​

​​三、Stream流綜合練習​​

一、Stream流終結操作方法

概念:終結操作的意思,就是執行完此方法之後,Stream流将不能再執行其他操作

常見方法:

方法名 說明
void forEach(Consume action) 對此流的每個元素執行操作
long count() 傳回此流中的元素數

代碼示範:

public class StreamDemo {
    public static void main(String[] args) {
        //建立一個集合,存儲多個字元串元素 
        ArrayList<String> list = new ArrayList<String>();

        list.add("林值瓦");
        list.add("張無極");
        list.add("王天涯");
        list.add("柳梅");
        list.add("張望");
        list.add("張啟天");

        //需求1:把集合中的元素在控制台輸出 
        list.stream().forEach(System.out::println); 

        //需求2:統計集合中有幾個以張開頭的元素,并把統計結果在控制台輸出 
        long count = list.stream().filter(s -> s.startsWith("張")).count();
        System.out.println(count);
    }
}      

二、Stream流的收集操作

概念:對資料使用Stream流的方式操作完畢後,可以把流中的資料收集到集合中

常用方法:

方法名 說明
R collect(Collector collector) 把結果收集到集合中

工具類Collectors提供了具體的收集方式:

方法名 說明
public static Collector toList() 把元素收集到List集合中
public static Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

代碼示範:

public class CollectDemo {
    public static void main(String[] args) {
        //建立List集合對象 
        List<String> list = new ArrayList<String>();

        list.add("孫悟空");
        list.add("孫行者");
        list.add("王寶強");
        list.add("柳神"); 

        //需求1:得到名字為3個字的流 
        Stream<String> listStream = list.stream().filter(s -> s.length() == 3); 
        //需求2:把使用Stream流操作完畢的資料收集到List集合中并周遊 
        List<String> names = listStream.collect(Collectors.toList()); 
        for(String name : names) { 
        System.out.println(name); 
        }

        //建立Set集合對象 
        Set<Integer> set = new HashSet<Integer>();
        set.add(10);
        set.add(20);
        set.add(30);
        set.add(33);
        set.add(35); 

        //需求3:得到年齡大于25的流 
        Stream<Integer> setStream = set.stream().filter(age -> age > 25); 

        //需求4:把使用Stream流操作完畢的資料收集到Set集合中并周遊 
        Set<Integer> ages = setStream.collect(Collectors.toSet()); 
        for(Integer age : ages) { 
            System.out.println(age); 
        }

        //定義一個字元串數組,每一個字元串資料由姓名資料和年齡資料組合而成 
        String[] strArray = {"孫悟空,560", "孫行者,555", "王寶強,33", "柳神,22"};

        //需求5:得到字元串中年齡資料大于28的流 
        Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);

        //需求6:把使用Stream流操作完畢的資料收集到Map集合中并周遊,字元串中的姓名作鍵,年齡作值 
        Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));

        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            Integer value = map.get(key);
            System.out.println(key + "," + value);
        }
    }
}      

三、Stream流綜合練習

需求:

現在有兩個ArrayList集合,分别存儲6名男演員名稱和6名女演員名稱,要求完成如下操作:

男演員隻要名字為3個字的前三人

女演員隻要姓林的,并且不要第一個

public class Actor {
    private String name;

    public Actor(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class StreamTest {
    public static void main(String[] args) {
        //建立集合 
        ArrayList<String> manList = new ArrayList<String>();
        manList.add("周潤發");
        manList.add("成龍");
        manList.add("劉德華");
        manList.add("吳京");
        manList.add("周星馳");
        manList.add("李連傑");

        ArrayList<String> womanList = new ArrayList<String>();
        womanList.add("林心如");
        womanList.add("張曼玉");
        womanList.add("林青霞");
        womanList.add("柳岩");
        womanList.add("林志玲");
        womanList.add("王祖賢"); 

        //男演員隻要名字為3個字的前三人
        Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3); 

        //女演員隻要姓林的,并且不要第一個 
        Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1); 

        //把過濾後的男演員姓名和女演員姓名合并到一起 
        Stream<String> stream = Stream.concat(manStream, womanStream); 

        //把上一步操作後的元素作為構造方法的參數建立演員對象,周遊資料 
        // stream.map(Actor::new).forEach(System.out::println); 
        stream.map(Actor::new).forEach(p -> System.out.println(p.getName())); 

        //把以上操作聯合在一起
        Stream.concat(manList.stream().filter(s -> s.length() == 3).limit(3), womanList
            .stream().filter(s -> s.startsWith("林")).skip(1)).map(Actor::new)
            .forEach(p -> System.out.println(p.getName()));
    }    
}      

繼續閱讀