四、建立Stream流

一、前言

Java8 中有兩個最爲重要的改變。
第一就是Lambda表達式;另一個就是Stream API算法

StreamJava8中處理集合的關鍵抽象概念,他能夠指定你但願對集合進行的操做,能夠執行很是複雜的查找,過濾,和映射數據等操做。數據庫

使用Stream API對集合數據進行操做,就相似使用SQL執行的數據庫查詢。也可使用Stream API進行並行執行操做。數組

簡而言之,StreamAPI提供了一種高效且易於使用的處理數據的方式。dom

二、基本概念

a sequence of elements supporting sequential and parallel aggregate operations.

Stream是元素的集合(這點讓stream看起來相似iterator),能夠支持順序和並行 的對原stream進行匯聚操做ide

  • 說白了,流是數據渠道,用於操做數據源(集合、數組等)所生成的元素序列,集合講的是數據,流講的是計算
  • 你們能夠把Stream當成一個高級版本的Iterator。原始版本的Iterator,用戶只能一個一個的遍歷元素並對其執行某些操做;高級版本的Stream,用戶只要給出須要對其包含的元素執行什麼操做,好比「過濾掉長度大於10的字符串」、「獲取每一個字符串的首字母」等,具體這些操做如何應用到每一個元素上,就給Stream就行了!

你們看完這些可能對Stream尚未一個直觀的認識,莫急,我們來段代碼。code

List<Person> pList = new ArrayList<>();
        Person p1 = new Person("tom", "23", "175", "36512@qq.com");
        Person p2 = new Person("jack", "34", "185", "888@qq.com");
        Person p3 = new Person("rose", "14", "176", "9566@qq.com");

        pList.add(p1);
        pList.add(p2);
        pList.add(p3);

       int count = (int) pList.stream().filter(x -> x.getAge().equals("23")).count();
        System.out.println("count:" + count);

上面這段代碼獲取的是年紀爲23的人的個數對象

注意點blog

  1. Stream不會本身存儲元素
  2. Stream不會改變源對象。相反,他們會返回一個持有結果的新Stream
  3. Stream操做是延遲執行的。這意味着他們會等到須要結果的時候才執行

三、基本語法

上圖就是對於Stream例子的一個解析,能夠很清楚的看見:本來一條語句被三種顏色的框分割成了三個部分接口

  • 紅色框中的語句是一個Stream的生命開始的地方,負責建立一個Stream實例element

  • 綠色框中的語句是賦予Stream靈魂的地方,把一個Stream轉換成另一個Stream,紅框的語句生成的是一個包含全部nums變量的Stream,進過綠框的filter方法之後,從新生成了一個過濾掉原nums列表全部null之後的Stream

  • 藍色框中的語句是豐收的地方,把Stream的裏面包含的內容按照某種算法來匯聚成一個值,例子中是獲取Stream中包含的元素個數。

3.一、建立Stream流

建立Stream存在兩種途徑

  • 經過Stream靜態工廠方法
  • 經過Collection接口的默認方法--stream(),把一個Collection對象轉成Stream

使用Strean靜態方法建立Stream

一、經過 of(T...)方法

List<Student> studentList = new ArrayList<>();
        studentList.add(new Student(1,"趙迪",23));
        studentList.add(new Student(2,"tom",25));
        studentList.add(new Student(2,"jack",27));
        studentList.add(new Student(2,"rose",22));

        Stream stream = Stream.of(studentList);

二、經過generator()方法

generator方法能夠生成一個無限長度的Stream,其元素的生成是經過給定的Supplier(這個接口能夠當作一個對象的工廠,每次調用返回一個給定類型的對象)

Stream.generate(new Supplier<Double>() {

    @Override
    public Double get() {
        return Math.random();
    }
});

Stream.generate(() -> Math.random());

Stream.generate(Math::random);

三條語句的做用都是同樣的,只是使用了lambda表達式和方法引用的語法來簡化代碼。

每條語句其實都是生成一個無限長度的Stream,其中值是隨機的。

這個無限長度Stream是懶加載,通常這種無限長度的Stream都會配合Streamlimit()方法來用。

經過Collection子類獲取Stream

以下的代碼是collection源碼中的默認方法,因此說能夠直接在子類中獲取stream

default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
相關文章
相關標籤/搜索