Java8函数式编程之Stream编程详解(3)Stream的创建方式
本文我们重点讲解一下Stream流的创建方式。
4.6 流的创建
流的创建方式一般有四种,分别是
由值创建流
由数组创建流
由文件创建流
由函数生成流(无限流)
接下来我们通过代码直观感受下这四种方式
4.6.1.由值创建流
@Test
public void streamFromValue() {
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
integerStream.forEach(System.out::println);
}
我们通过Stream.of()方法构建了一个整型流,并进行打印(通过System.out方法引用),运行结果
1
2
3
4
5
4.6.2.由数组创建流
@Test
public void streamFromArray() {
int[] numbers = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(numbers);
stream.forEach(System.out::println);
}
这种方式其实和通过值类似,Arrays工具类的stream方法允许对传入的一个数组对象,并输出对应类型的流。
运行结果
1
2
3
4
5
4.6.3.由文件创建流
@Test
public void streamFromFile() throws IOException {
// 返回指定路径下文件中每一行够成的字符串流
Stream<String> stream = Files.lines(Paths.get("src/main/java/com/sankuai/meituan/waimai/bizad/jdk8/stream/package-info.java"));
stream.forEach(System.out::println);
}
我们可以通过文件生成字符串流,通过调用Files.lines(Path path)方法,生成一个字符串流。
运行结果
...省略部分输出...
* 预定义收集器功能(Collectors)
* 1. 将流元素规约和汇总为一个值
* 2. 将流元素分组
* 3. 将流元素分区
* 1. 参考资料
* 区别peek与map https://blog.csdn.net/tckt75433/article/details/81510743
*
*/
Process finished with exit code 0
这里输出的是文件package-info.java中的内容,感兴趣的同学可以传入其他文件查看运行效果。
我们看一下Files.lines方法的声明
public static Stream<String> lines(Path path) throws IOException {
可见是通过Stream,逐行返回文件的每一行字符串
4.6.4.由函数生成流(无限流)
@Test
public void streamFromFunction() {
Stream<Double> generate = Stream.generate(Math::random);
// 通过limit限制数量
generate.limit(10)
.forEach(System.out::println);
}
由函数生成的流为无限流,也就是如果我们没有做其他的限制(如:指定limit),对其做迭代操作,会一直运行。
这个案例中,我们通过 Math::random 生成随机数,限制生成十个并打印,运行结果
0.8969250722445276
0.8285057001330353
0.2419437635017867
0.11082352196746204
0.8035381196761233
0.5600709938550267
0.21051515736759363
0.8671614956980346
0.8063736774791785
0.8656071095608636
如果去掉limit()会怎样?感兴趣的同学可以自行尝试,相信会加深你对“无限流”的认识。
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。