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)附加說明

第一種建立方式: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)運作結果
(3)幾點說明
(1)Stream中的of()方法(2)@Test注解說明![]()
Lambda表達式八:Stream流二:Stream流的5種建立方式; (3)forEach()方法說明![]()
Lambda表達式八:Stream流二:Stream流的5種建立方式; ![]()
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)運作結果
(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)運作結果
(3)幾點說明
(1)Stream中的generate()方法
generate()方法參數是一個Supplier函數式接口的實作,generate()的參數自然可以是一個Lambda表達式;Lambda表達式會建立一個新的對象,而這個新的對象會被納入到生成的流中。
(2)Supplier函數式接口簡單說明![]()
Lambda表達式八:Stream流二:Stream流的5種建立方式; ![]()
Lambda表達式八:Stream流二:Stream流的5種建立方式; (3)上面,利用generate()方法會建立一個無限長度的資料流;![]()
Lambda表達式八:Stream流二:Stream流的5種建立方式;
(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("**********");
}
}
注: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)運作結果
(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));
}
}
運作結果:
注:這個案例非常常見于使用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)運作結果
(3)幾點說明
(1)chars()方法說明![]()
Lambda表達式八:Stream流二:Stream流的5種建立方式; ![]()
Lambda表達式八:Stream流二:Stream流的5種建立方式;
(4)附加說明
背後原理:int整數和char是可以互相轉換的
注:這種利用字元序列建立流的方式,在實際中使用的比較少。比如對字元進行資料加密時,或者搭建應用最底層架構時,即必須要對字元串的每一個字元進行處理時才會考慮使用這種方式。