感謝原創(chuàng)!
這篇局劲,我們來看Stream的一些中間操作勺拣,關于中間操作的一些介紹,可以看《JAVA8 stream接口 中間操作和終端操作》
1鱼填,filter操作药有,我們先看方法的定義
Stream<T> filter(Predicate<? super T> predicate);
這個方法,傳入一個Predicate的函數(shù)接口苹丸,關于Predicate函數(shù)接口定義愤惰,可以查看《JAVA8 Predicate接口》,這個接口傳入一個泛型參數(shù)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的函數(shù)式接口兼都,接口定義可以查看《JAVA8 Function接口》,這個接口稽寒,接收一個泛型T扮碧,返回泛型R,map函數(shù)的定義杏糙,返回的流慎王,表示的泛型是R對象,這個表示宏侍,調(diào)用這個函數(shù)后赖淤,可以改變返回的類型,先看下面的案例
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字符串绷耍,單獨輸出吐限;現(xiàn)在,我們只看到了一個forEach的終端操作褂始,后面诸典,我們會看到,更多的終端操作崎苗,把map操作后狐粱,改變的對象類型,返回各種類型的集合胆数,或者對數(shù)字類型的脑奠,返回求和,最大幅慌,最小等的操作宋欺;
3.flatMap操作,我們還是先看接口定義
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
這個接口胰伍,跟map一樣齿诞,接收一個Fucntion的函數(shù)式接口,不同的是骂租,F(xiàn)unction接收的泛型參數(shù)祷杈,第二個參數(shù)是一個Stream流;方法渗饮,返回的也是泛型R但汞,具體的作用是把兩個流宿刮,變成一個流返回,下面私蕾,我們看一個案例僵缺,來詳細解答,怎么把兩個流的內(nèi)容踩叭,變成一個流的內(nèi)容
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("")龟糕,根據(jù)空字符串分隔桐磁,返回的類型是一個數(shù)組悔耘,返回的流也是Stream<String[]>,而不是Stream<String>我擂;在第二段代碼中衬以,數(shù)組的流,經(jīng)過map操作校摩,返回Stream<String[]>后看峻,再經(jīng)過flatMap,把數(shù)組通過Arrays.stream變成一個新的流衙吩,再返回到原來的流里互妓;這樣,兩個流就合并成一個流坤塞;第三段代碼冯勉,是第二段代碼的,另一種寫法摹芙;
1.lambda表達式
《java8 lambda表達式灼狰,方法的引用以及構造器的引用》
2.函數(shù)式接口
3.stream接口操作
《 java8 Stream-創(chuàng)建流的幾種方式》
《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 stream接口 終端操作 collect操作》
4.其他部分