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是可以互相转换的
注:这种利用字符序列创建流的方式,在实际中使用的比较少。比如对字符进行数据加密时,或者搭建应用最底层框架时,即必须要对字符串的每一个字符进行处理时才会考虑使用这种方式。