转载:猿天地 链接:http://cxytiandi.com/blog/detail/2220
Stream 作为 Java 8 的一大亮点,我个人是非常喜欢用的,用起来爽多了。
可以通过of来定义stream,也可以通过集合来转成stream。
Stream<String> stream =
Stream.of("java", "css", "php");
stream = Arrays.asList(
"张三", "张三丰", "张大佛爷", "张").stream();
也可以使用generate产生无限数量的stream,当然可以用limit方法限制
下面的语句将产生无数的随机数字,将一直循环下去
Stream<Double> dsStream =
Stream.generate(Math::random);
dsStream.forEach(System.out::println);
filter方法的使用,filter顾名思义,过滤的作用,怎么过滤呢?
比如说我们有个姓名的集合,想要统计出集合里名字的字数大于1的数量有多少?
首先是不使用stream的传统方法
List<String> contents =
Arrays.asList("张三", "张三丰", "张大佛爷", "张");
int count = 0;
for (String con : contents) {
if(con.length() > 1) {
count++;
}
}
System.out.println(count);
下面是使用stream之后的代码,一行就搞定了,在filter方法里用lambda表达式进行过滤,然后用count方法统计出符合条件的数量。
long new_count = contents.stream()
.filter(con -> con.length() > 1).count();
System.out.println(new_count);
当然如果你的数据量比较多,而你希望统计的速度更快时,可以使用并行处理的stream来操作。
new_count = contents.parallelStream()
.filter(con -> con.length() > 1).count();
map其实就是将stream中的数据映射成 output Stream 的另外一个元素。全部循环的过一遍。
使用map可以将stream中的值都转成大小写,如果用List的话还得循环变量然后取toUpperCase()
Stream<String> stream =
Stream.of("java", "css", "php");
stream.map(String::toUpperCase)
.forEach(System.out::println);
不同的点在于flatMap是将多个stream中的多个数据集合连接起来成为一个最终的stream。
Stream<List<Integer>> number_stream =
Stream.of(
Arrays.asList(10),
Arrays.asList(22, 33),
Arrays.asList(44, 55, 66)
);
number_stream.flatMap((c) -> c.stream())
.forEach(System.out::println);
最终的结果就变成了Stream 输出结果就是10,22,33,44,55,66