stream是Java8中最好用的特性之一,也可以说最好用的特性,没有之一。它可以让我们的开发更加简洁高效,可以让代码更加美观,总之好处多多,用起来也是十分的舒服。
废话不多说,开始实战。
- 最常用的一个,遍历:
Integer[] intArray = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
List<Integer> intList = Arrays.asList(intArray);
intList.stream().forEach(System.out::println);
通常这样的代码会被要求改为
Integer[] intArray = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
List<Integer> intList = Arrays.asList(intArray);
intList.forEach(System.out::println);
因为这样的简单遍历确实也没必要使用stream。
- 并行遍历:
Integer[] intArray = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
List<Integer> intList = Arrays.asList(intArray);
intList.stream().parallel().forEach(System.out::println);
这个也可以简写为:
Integer[] intArray = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
List<Integer> intList = Arrays.asList(intArray);
intList.parallelStream().forEach(System.out::println);
但是这个使用需谨慎,有两点需要注意:
- 如果list过大,可能会开过多线程消耗资源;
- 如果后面要使用list,做一些处理,那么可能处理的时候遍历还没有执行完;
- 用来声明一个list:
List<Integer> integerList = Stream.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).collect(Collectors.toList());
这样可以很方便地生成一个list,不需要再去声明一个list然后一个一个add或者声明一个数组再转成list。
-
filter的使用
filter顾名思义就是一个过滤器(关于函数式接口的内容这里就不详述了,后面再单独写一篇),可以过滤出你想要的部分。
比如说上面的list,过滤出所有的偶数:
image.png
filter()的括号里面其实就是一个函数式接口,接收一个参数然后返回表达式的布尔值,是true的留下,false的就过滤掉了。
-
map的使用
map是可以将stream中的所有元素操作后生成新的list,比如要将上面的list中所有的元素加1:
image.png
-
flatMap的使用
先看一下这个代码:
List<String> stringList = Stream.of("a:b:c", "d:e:f").collect(Collectors.toList());
List<String[]> resultList = stringList.stream().map(s -> s.split(":")).collect(Collectors.toList());
resultList.forEach(result -> System.out.println(Arrays.toString(result)));
我是想把这个stringList的所有元素拆分,但是使用map拆分之后的效果就是得到了一个String[]数组的list,打印和使用都很不方便。输出结果:
[a, b, c]
[d, e, f]
但是如果使用flatMap的话:
List<String> stringList = Stream.of("a:b:c", "d:e:f").collect(Collectors.toList());
List<String> resultList = stringList.stream().flatMap(s -> Stream.of(s.split(":"))).collect(Collectors.toList());
System.out.println(resultList);
那么输出结果就是一个String的list了,如下:
[a, b, c, d, e, f]
不管是打印还是使用,就都非常方便了。
网友评论