JAVA8 Stream接口,map操作,filter操作,flatMap操作

這篇,我們來看Stream的一些中間操作,關於中間操作的一些介紹,可以看《JAVA8 stream接口 中間操作和終端操作》

1,filter操作,我們先看方法的定義

Stream<T> filter(Predicate<? super T> predicate);

這個方法,傳入一個Predicate的函數接口,關於Predicate函數接口定義,可以查看《JAVA8 Predicate接口》,這個接口傳入一個泛型參數T,做完操作之後,返回一個boolean值;filter方法的作用,是對這個boolean做判斷,返回true判斷之後的對象,下面一個案例,可以看到怎麼使用

String[] dd = { "a", "b", "c" };
        Stream<String> stream = Arrays.stream(dd);
        stream.filter(str -> str.equals("a")).forEach(System.out::println);//返回字符串爲a的值

2.map操作,先看方法定義

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

這個方法傳入一個Function的函數式接口,接口定義可以查看《JAVA8 Function接口》,這個接口,接收一個泛型T,返回泛型R,map函數的定義,返回的流,表示的泛型是R對象,這個表示,調用這個函數後,可以改變返回的類型,先看下面的案例

public class TestJava8 {
    public static void main(String[] args) {
        Integer[] dd = { 1, 2, 3 };
        Stream<Integer> stream = Arrays.stream(dd);
        stream.map(str -> Integer.toString(str)).forEach(str -> {
            System.out.println(str);// 1 ,2 ,3
            System.out.println(str.getClass());// class java.lang.String
        });
 
        List<Emp> list = Arrays.asList(new Emp("a"), new Emp("b"), new Emp("c"));
        list.stream().map(emp -> emp.getName()).forEach(str -> {
            System.out.println(str);
        });
 
    }
 
    public static class Emp {
        private String name;
 
        public Emp() {
            super();
        }
 
        public Emp(String name) {
            super();
            this.name = name;
        }
 
        public String getName() {
            return name;
        }
 
        public void setName(String name) {
            this.name = name;
        }
 
    }
}

可以看到,我們把Integer,變成了String輸出,把Emp對象裏的name字符串,單獨輸出;現在,我們只看到了一個forEach的終端操作,後面,我們會看到,更多的終端操作,把map操作後,改變的對象類型,返回各種類型的集合,或者對數字類型的,返回求和,最大,最小等的操作;

 

3.flatMap操作,我們還是先看接口定義

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

這個接口,跟map一樣,接收一個Fucntion的函數式接口,不同的是,Function接收的泛型參數,第二個參數是一個Stream流;方法,返回的也是泛型R,具體的作用是把兩個流,變成一個流返回,下面,我們看一個案例,來詳細解答,怎麼把兩個流的內容,變成一個流的內容

public class TestJava8 {
    public static void main(String[] args) {
        String[] strs = { "aaa", "bbb", "ccc" };
        Arrays.stream(strs).map(str -> str.split("")).forEach(System.out::println);// Ljava.lang.String;@53d8d10a
        Arrays.stream(strs).map(str -> str.split("")).flatMap(Arrays::stream).forEach(System.out::println);// aaabbbccc
        Arrays.stream(strs).map(str -> str.split("")).flatMap(str -> Arrays.stream(str)).forEach(System.out::println);// aaabbbccc
    }
}

首先,第一個輸出語句裏,我們看到,我們輸出的對象,並不是想象中的具體的字符串,第二段代碼,才輸出的具體的字符串;

第一段輸出代碼裏,我們先看map操作,通過上面對map的介紹,我們可以看到,map可以改變返回的Stream的泛型,str.split(""),根據空字符串分隔,返回的類型是一個數組,返回的流也是Stream<String[]>,而不是Stream<String>;在第二段代碼中,數組的流,經過map操作,返回Stream<String[]>後,再經過flatMap,把數組通過Arrays.stream變成一個新的流,再返回到原來的流裏;這樣,兩個流就合併成一個流;第三段代碼,是第二段代碼的,另一種寫法;

 

 

1.lambda表達式
《java8 Lambda表達式簡介》

《java8 lambda表達式,方法的引用以及構造器的引用》

2.函數式接口
《java8 函數式接口簡介》

《JAVA8 Function接口以及同類型的特化的接口》

《JAVA8 Consumer接口》

《JAVA8 Supplier接口》

《JAVA8 UnaryOperator接口》

《JAVA8 BiConsumer 接口》

3.stream接口操作

《java8 Stream接口簡介》

《 java8 Stream-創建流的幾種方式》

《JAVA8 stream接口 中間操作和終端操作》

《JAVA8 Stream接口,map操作,filter操作,flatMap操作》

《JAVA8 stream接口 distinct,sorted,peek,limit,skip》

《java8 stream接口 終端操作 forEachOrdered和forEach》

《java8 stream接口 終端操作 toArray操作》

《java8 stream接口 終端操作 min,max,findFirst,findAny操作》

《java8 stream接口終端操作 count,anyMatch,allMatch,noneMatch》

《java8 srteam接口終端操作reduce操作》

《java8 stream接口 終端操作 collect操作》

4.其他部分

《java8 Optional靜態類簡介,以及用法》

發佈了13 篇原創文章 · 獲贊 12 · 訪問量 4547
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章