天天看點

Lambda表達式八:Stream流二:Stream流的5種建立方式;

5種建立Stream流的方式;(PS:可以發現,背後大量使用了Lambda表達式;)

目錄

第一種建立方式:Stream.of(arr):基于數組進行建立(常用)

(1)示例代碼

(2)運作結果

(3)幾點說明

 第二種建立方式:list.stream():基于集合進行建立(常用)

(1)示例代碼

(2)運作結果

(3)幾點說明

第三種建立方式:Stream.generate():利用generate()方法建立無限長度流(不常用)

(1)示例代碼

(2)運作結果

(3)幾點說明

(4)改進:limit()方法限制流的長度

第四種建立方式:Stream.iterate():利用iterate()方法,基于疊代器建立流(不常用)

 (1)案例代碼

(2)運作結果

(3)幾點說明

(4)改進:limit()方法限制流的長度

第五種建立方式:Stream.iterate():基于字元序列建立流(不常用)

(1)案例代碼

(2)運作結果

(3)幾點說明

(4)附加說明

Lambda表達式八:Stream流二:Stream流的5種建立方式;

第一種建立方式:Stream.of(arr):基于數組進行建立(常用)

(1)示例代碼

package com.imooc.stream;

import org.junit.Test;

import java.util.stream.Stream;

/**
 * Stream流對象的五種建立方式
 */
public class StreamGenerator {

    /**
     * 第一種建立方式:基于數組進行建立
     */
    @Test
    public void generator1() {
        String[] arr = {"Lily","Jack","Jordan","Gavin","張三"};
        // Stream中的靜态方法of(),參數是可變參數(自然可以傳入一個數組),傳回值是一個Stream類型對象;
        // 需要增加一個泛型,說明數組中的資料類型;
        // 這樣以後Stream流對象就建立好了,隻有建立了這個Stream流對象,才能使用一系列流式處理的方法,來簡化對資料的操作;
        Stream<String> stringStream = Stream.of(arr);
        stringStream.forEach(s -> System.out.println(s));
    }
}
           

(2)運作結果

Lambda表達式八:Stream流二:Stream流的5種建立方式;

(3)幾點說明

(1)Stream中的of()方法
Lambda表達式八:Stream流二:Stream流的5種建立方式;
(2)@Test注解說明
Lambda表達式八:Stream流二:Stream流的5種建立方式;
(3)forEach()方法說明
Lambda表達式八:Stream流二:Stream流的5種建立方式;

……………………………………………………

 第二種建立方式:list.stream():基于集合進行建立(常用)

(1)示例代碼

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

/**
 * Stream流對象的五種建立方式
 */
public class StreamGenerator {

    /**
     * 第二種建立方式:基于集合進行建立
     */
    @Test
    public void generator2(){
        List<String> list = new ArrayList<String>();
        list.add("張三");
        list.add("李四");
        list.add("王五");
        list.add("趙六");
        Stream<String> stringStream = list.stream();
        stringStream.forEach(s -> System.out.println(s));
    }
}
           

(2)運作結果

Lambda表達式八:Stream流二:Stream流的5種建立方式;

(3)幾點說明

(1)List和ArrayList類中雖然沒有stream方法的,但是Collection接口中是有stream方法的,而List接口又繼承了Collection接口:是以List對象可以直接調用stream方法得到Stream類型的對象
Lambda表達式八:Stream流二:Stream流的5種建立方式;

(2)這種方式,因為stream()方法就是集合中定義的方法,是以比較友善;

(3)【第一種建立方式:Stream.of(arr):基于數組進行建立】和【 第二種建立方式:list.stream():基于集合進行建立】是實際中最常使用的方法。接下來的三種方式使用的不多,隻做一般性了解即可。

……………………………………………………

第三種建立方式:Stream.generate():利用generate()方法建立無限長度流(不常用)

(1)示例代碼

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

/**
 * Stream流對象的五種建立方式
 */
public class StreamGenerator {

    /**
     * 第三種建立方式:利用generate方法建立無限長度流
     */
    @Test
    public void generetor3() {
        Stream<Integer> stream = Stream.generate(() -> new Random().nextInt(100000));
        stream.forEach(i -> System.out.println(i));

    }

}
           

(2)運作結果

Lambda表達式八:Stream流二:Stream流的5種建立方式;

(3)幾點說明

(1)Stream中的generate()方法

generate()方法參數是一個Supplier函數式接口的實作,generate()的參數自然可以是一個Lambda表達式;Lambda表達式會建立一個新的對象,而這個新的對象會被納入到生成的流中。

Lambda表達式八:Stream流二:Stream流的5種建立方式;
(2)Supplier函數式接口簡單說明
Lambda表達式八:Stream流二:Stream流的5種建立方式;
Lambda表達式八:Stream流二:Stream流的5種建立方式;
(3)上面,利用generate()方法會建立一個無限長度的資料流;

(4)改進:limit()方法限制流的長度

無限長度的資料流本身是沒有意義的,因為程式會停留在【stream.forEach(i -> System.out.println(i));】一直輸出,程式不能正常的往下走了。

為了解決這個問題,在Stream中提供了另一個方法limit()方法:限制流的長度;

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

/**
 * Stream流對象的五種建立方式
 */
public class StreamGenerator {


    /**
     * 第三種建立方式:利用generate方法建立無限長度流;附帶limit方法,限制流的長度;
     */
    @Test
    public void generetor3() {
        Stream<Integer> stream = Stream.generate(() -> new Random().nextInt(100000));
        stream.limit(10).forEach(i -> System.out.println(i));
        System.out.println("**********");

    }

}
           
Lambda表達式八:Stream流二:Stream流的5種建立方式;
Lambda表達式八:Stream流二:Stream流的5種建立方式;
注:generate()建立無限長度資料流在實際中使用的是比較少的,就算使用也經常配合limit()方法來使用。

……………………………………………………

第四種建立方式:Stream.iterate():利用iterate()方法,基于疊代器建立流(不常用)

 (1)案例代碼

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

/**
 * Stream流對象的五種建立方式
 */
public class StreamGenerator {

    /**
     * 第四種建立方式:基于疊代器建立流
     */
    @Test
    public void generator4(){
        Stream<Integer> stream = Stream.iterate(1, n -> n + 1);
        stream.forEach(i -> System.out.println(i));
    }

}
           

(2)運作結果

Lambda表達式八:Stream流二:Stream流的5種建立方式;

(3)幾點說明

(1)iterate()方法說明
Lambda表達式八:Stream流二:Stream流的5種建立方式;
Lambda表達式八:Stream流二:Stream流的5種建立方式;

(4)改進:limit()方法限制流的長度

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

/**
 * Stream流對象的五種建立方式
 */
public class StreamGenerator {

    /**
     * 第四種建立方式:基于疊代器建立流;附帶limit方法,限制流的長度;
     */
    @Test
    public void generator4(){
        Stream<Integer> stream = Stream.iterate(1, n -> n + 1);
        stream.limit(10).forEach(i -> System.out.println(i));
    }

}
           

運作結果:

Lambda表達式八:Stream流二:Stream流的5種建立方式;
注:這個案例非常常見于使用stream替代傳統的for循環,但盡管如此,使用還是比較少的。

 ……………………………………………………

第五種建立方式:Stream.iterate():基于字元序列建立流(不常用)

(1)案例代碼

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * Stream流對象的五種建立方式
 */
public class StreamGenerator {

    /**
     * 第五種建立方式:基于字元序列建立流
     */
    @Test
    public void generator5(){
        String str = "abcdefg嘿嘿";
        IntStream stream = str.chars();
        stream.forEach(c -> System.out.println(c));
    }

}
           

(2)運作結果

Lambda表達式八:Stream流二:Stream流的5種建立方式;

(3)幾點說明

(1)chars()方法說明
Lambda表達式八:Stream流二:Stream流的5種建立方式;
Lambda表達式八:Stream流二:Stream流的5種建立方式;

(4)附加說明

背後原理:int整數和char是可以互相轉換的

Lambda表達式八:Stream流二:Stream流的5種建立方式;
注:這種利用字元序列建立流的方式,在實際中使用的比較少。比如對字元進行資料加密時,或者搭建應用最底層架構時,即必須要對字元串的每一個字元進行處理時才會考慮使用這種方式。