1. 程式人生 > >Stream流(jdk新特性)

Stream流(jdk新特性)

Stream流

  • java8,通過Lambda表示式引入

獲取流物件

java.util.stream.Stream是Java 8新加入的最常用的流介面。(這並不是一個函式式介面。)

獲取一個流非常簡單,有以下幾種常用的方式:
- 所有的Collection集合都可以通過stream預設方法獲取流;
- java.util.Map介面不是Collection的子介面,且其K-V資料結構不符合流元素的單一特徵,所以獲取對應的流需要分key、value或entry等情況:
- Stream介面的靜態方法of可以獲取陣列對應的流。

### ==通過Collection集合獲取流物件==
- 首先,java.util.Collection介面中加入了default方法stream用來獲取流,所以其所有實現類均可獲取流。



public class Collection2Stream(){
    //collection集合
    Collection c = new Collection();
    Stream stream1 = c.stream();

    //List集合
    List<String> list = new ArrayList<>();
    Stream<String> stream2 = list.stream();

    //Set集合
    Set<String> set = new HashSet<>
(); Stream<String> stream3 = set.stream(); //Map集合 HashMap<String,String> map = new HashMap<>(); //1.keyset集合 Stream<String> stream1 = map.keySet().stream(); //2. values Stream<Integer> stream2 = map.values().stream(); // 3. entrySet Stream<
Map.Entry<String, Integer>> stream3 = map.entrySet().stream(); }

根據Map獲取流



public class Map2Stream(){

    //Map集合
    HashMap<String,String> map = new HashMap<>();
    //1.keyset集合
    Stream<String> stream1 = map.keySet().stream();
    //2. values
    Stream<Integer> stream2 = map.values().stream();
    // 3. entrySet
    Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();

}

根據陣列獲取流

  • 如果使用的不是集合或對映而是陣列,由於陣列物件不可能新增預設方法,所以Stream介面中提供了靜態方法of,使用很簡單:
public class Array2Stream(){


    String[] array = { "張無忌", "張翠山", "張三丰", "張一元" };

    // Stream 類的靜態方法 : of
    Stream<String> stream = Stream.of(array);
    System.out.println("stream = " + stream);

}

Stream流的常用API

  • 在上述介紹的各種方法中,凡是返回值仍然為Stream介面的為函式拼接方法,它們支援鏈式呼叫;而返回值不再為Stream介面的為終結方法,不再支援鏈式呼叫。如下表所示:
方法名 方法作用 方法種類 是否支援鏈式呼叫
count 統計個數 終結
forEach 逐一處理 終結
filter 過濾 函式拼接
limit 取前幾個 函式拼接
skip 跳過前幾個 函式拼接
map 對映 函式拼接
contact 組合 函式拼接

流API的使用

逐一處理:forEach

  • void forEach(Consumer

統計個數:count

  • 返回值為long型別

void forEach(Consumer<? super T> action);
該方法接收一個Consumer介面函式,會將每一個流元素交給該函式進行處理。例如:

import java.util.stream.Stream;

public class Test1 {
    public static void main(String[] args) {

        Stream<String> stream = Stream.of("張無忌", "張學友", "劉德華", "張三丰");

        // void forEach(Consumer<? super T> action);
        stream.forEach(System.out::println);
        //返回值為long
        long count = stream.count();
    }
}

過濾:filter

  • Stream filter(Predicate

取前幾個:limit

  • Stream limit(long maxSize);

跳過前幾個:skip

  • Stream skip(long n);
public class Test1 {
    public static void main(String[] args) {

        Stream<String> stream = Stream.of("張無忌", "張學友", "劉德華", "張三丰");

        stream.filter(name->name.startsWith("張"))
              .limit(2)
              .forEach(System.out::println);

    }
}

對映:map

- `<R> Stream<R> map(Function<? super T, ? extends R> mapper);`
- 該介面需要一個Function函式式介面引數,可以將當前流中的 T 型別資料轉換為另一種 R 型別的流。
import java.util.stream.Stream;

public class Test1 {
    public static void main(String[] args) {

        Stream<String> stream = Stream.of("10", "20", "30", "40", "50");

        // <R> Stream<R> map(Function<? super T, ? extends R> mapper);
        // Function 介面 : R apply(T t);
        stream.map(Integer::parseInt).forEach(System.out::println);
    }
}

組合:concat

  • 如果有兩個流,希望合併成為一個流,那麼可以使用Stream介面的靜態方法concat:
    • static Stream concat(Stream
import java.util.stream.Stream;

public class Test2 {
    public static void main(String[] args) {

        Stream<String> stream1 = Stream.of("劉德華", "張學友", "黎明", "郭富城");
        Stream<String> stream2 = Stream.of("西施", "楊玉環", "貂蟬", "王昭君");

        Stream<String> stream = Stream.concat(stream1, stream2);
        stream.forEach(System.out::println);
    }
}