JDK1.8新特性:Stream流
目錄
一、獲取流
1.根據(jù)Collection獲取流
2.根據(jù)Map獲取流
3.根據(jù)數(shù)組獲取流
二.常用方法
1.過(guò)濾:filter
2.統(tǒng)計(jì)個(gè)數(shù):count
3.取用前幾個(gè):limit
4.跳過(guò)前幾個(gè):skip
5.映射:map
6.組合:concat
7.逐一處理:forEach
三、常用方法綜合案例
四、函數(shù)拼接與終結(jié)方法
五、收集Stream結(jié)果
1.Stream轉(zhuǎn)集合
2.Stream轉(zhuǎn)數(shù)組
3.Stream轉(zhuǎn)數(shù)組方式二
一、獲取流
java.util.stream.Stream<T> 是Java 8新加入的最常用的流接口。(這并不是一個(gè)函數(shù)式接口。)
獲取一個(gè)流非常簡(jiǎn)單,有以下幾種常用的方式:
(1)所有的Collection 集合都可以通過(guò)stream 默認(rèn)方法獲取流;
(2)Stream 接口的靜態(tài)方法of 可以獲取數(shù)組對(duì)應(yīng)的流。
1.根據(jù)Collection獲取流
java.util.Collection 接口中加入了default方法stream 用來(lái)獲取流,所以其所有實(shí)現(xiàn)類(lèi)均可獲取流。
List<String> list = new ArrayList<>();// ...Stream<String> stream1 = list.stream();Set<String> set = new HashSet<>();// ...Stream<String> stream2 = set.stream();Vector<String> vector = new Vector<>();// ...Stream<String> stream3 = vector.stream();2.根據(jù)Map獲取流
java.util.Map 接口不是Collection 的子接口,且其K-V數(shù)據(jù)結(jié)構(gòu)不符合流元素的單一特征,所以獲取對(duì)應(yīng)的流需要分key、value或entry等情況:
Map<String, String> map = new HashMap<>();Stream<String> keyStream = map.keySet().stream();Stream<String> valueStream = map.values().stream();Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();3.根據(jù)數(shù)組獲取流
如果使用的不是集合或映射而是數(shù)組,由于數(shù)組對(duì)象不可能添加默認(rèn)方法,所以Stream 接口中提供了靜態(tài)方法of。
String[] array = { "張無(wú)忌", "張翠山", "張三豐", "張一元" };Stream<String> stream = Stream.of(array);二.常用方法
流模型的方法被分成兩種:
終結(jié)方法:返回值類(lèi)型不再是Stream接口自身類(lèi)型的方法,不支持鏈?zhǔn)秸{(diào)用
非終結(jié)方法:返回值類(lèi)型仍然是Stream接口的方法,支持鏈?zhǔn)秸{(diào)用
1.過(guò)濾:filter
Stream<T> filter(Predicate<? super T> predicate);
2.統(tǒng)計(jì)個(gè)數(shù):count
long count();
3.取用前幾個(gè):limit
Stream<T> limit(long maxSize);
4.跳過(guò)前幾個(gè):skip
Stream<T> skip(long n);
5.映射:map
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
該接口需要一個(gè)Function 函數(shù)式接口參數(shù),可以將當(dāng)前流中的T類(lèi)型數(shù)據(jù)轉(zhuǎn)換為另一種R類(lèi)型的流。
6.組合:concat
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
7.逐一處理:forEach
void forEach(Consumer<? super T> action);
三、常用方法綜合案例
現(xiàn)在有兩個(gè)ArrayList 集合存儲(chǔ)隊(duì)伍當(dāng)中的多個(gè)成員姓名,要求使用傳統(tǒng)的for循環(huán)(或增強(qiáng)for循環(huán))依次進(jìn)行以
下若干操作步驟:
1. 第一個(gè)隊(duì)伍只要名字為3個(gè)字的成員姓名;
2. 第一個(gè)隊(duì)伍篩選之后只要前3個(gè)人;
3. 第二個(gè)隊(duì)伍只要姓張的成員姓名;
4. 第二個(gè)隊(duì)伍篩選之后不要前2個(gè)人;
5. 將兩個(gè)隊(duì)伍合并為一個(gè)隊(duì)伍;
6. 根據(jù)姓名創(chuàng)建Person 對(duì)象;
7. 打印整個(gè)隊(duì)伍的Person對(duì)象信息。
List<String> one = new ArrayList<>();one.add("迪麗熱巴");one.add("宋遠(yuǎn)橋");one.add("蘇星河");one.add("老子");one.add("莊子");one.add("孫子");one.add("洪七公");List<String> two = new ArrayList<>();two.add("古力娜扎");two.add("張無(wú)忌");two.add("張三豐");two.add("趙麗穎");two.add("張二狗");two.add("張?zhí)鞇?ài)");two.add("張三");// 第一個(gè)隊(duì)伍只要名字為3個(gè)字的成員姓名;// 第一個(gè)隊(duì)伍篩選之后只要前3個(gè)人;Stream<String> streamOne = one.stream().filter(s -> s.length() == 3).limit(3);// 第二個(gè)隊(duì)伍只要姓張的成員姓名;// 第二個(gè)隊(duì)伍篩選之后不要前2個(gè)人;Stream<String> streamTwo = two.stream().filter(s -> s.startsWith("張")).skip(2);// 將兩個(gè)隊(duì)伍合并為一個(gè)隊(duì)伍;// 根據(jù)姓名創(chuàng)建Person對(duì)象;// 打印整個(gè)隊(duì)伍的Person對(duì)象信息。Stream.concat(streamOne, streamTwo).map(Person::new).forEach(System.out::println);四、函數(shù)拼接與終結(jié)方法
五、收集Stream結(jié)果
1.Stream轉(zhuǎn)集合
Stream流提供collect 方法,其參數(shù)需要一個(gè)java.util.stream.Collector<T,A, R> 接口對(duì)象來(lái)指定收集到哪種集合中。幸運(yùn)的是, java.util.stream.Collectors 類(lèi)提供一些方法,可以作為Collector 接口的實(shí)例:
public static <T> Collector<T, ?, List<T>> toList() :轉(zhuǎn)換為L(zhǎng)ist 集合。
public static <T> Collector<T, ?, Set<T>> toSet() :轉(zhuǎn)換為Set 集合。
Stream<String> stream = Stream.of("10", "20", "30", "40", "50");List<String> list = stream.collect(Collectors.toList());Stream<String> stream1 = Stream.of("10", "20", "30", "40", "50");Set<String> set = stream1.collect(Collectors.toSet());2.Stream轉(zhuǎn)數(shù)組
Stream提供toArray 方法來(lái)將結(jié)果放到一個(gè)數(shù)組中,由于泛型擦除的原因,返回值類(lèi)型是Object[]的:
Object[] toArray();
Stream<String> stream3= Stream.of("10", "20", "30", "40", "50");Object[] objArray = stream3.toArray();3.Stream轉(zhuǎn)數(shù)組方式二
有了Lambda和方法引用之后,可以使用toArray 方法的另一種重載形式傳遞一個(gè)IntFunction<A[]> 的函數(shù),繼
而從外面指定泛型參數(shù)。方法簽名:
<A> A[] toArray(IntFunction<A[]> generator);
Stream<String> stream4 = Stream.of("10", "20", "30", "40", "50");String[] strArray = stream4.toArray(String[]::new);?
總結(jié)
以上是生活随笔為你收集整理的JDK1.8新特性:Stream流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C3P0连接池、DRUID连接池和Jdb
- 下一篇: 基础加强:反射和注解