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