Basic

What

Java8添加了一个新的抽象称为流Stream, 可以让你以一种声明的方式处理数据。 提高了生产力,方便地写出高效率、干净、简洁的代码。

对于流的处理,主要有三种关键性操作: 流的创建、中间操作(intermediate operation)以及最终操作(terminal operation)

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

Feature

  1. 无存储。不是一种数据结构,而是某种数据源的一个视图。数据源可以是一个数组,Java容器或I/O channel等
  2. 为函数式编程而生。对Stream的任何修改都不会修改背后的数据源。比如对Stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新Stream
  3. 惰性执行。操作并不会立即执行,只有等到用户真正需要结果的时候才会执行
  4. 可消费性。只能被消费一次,一旦遍历过就会失效,想要再次遍历需要重新生成

Operation

流的创建

通过已有的集合来创建流

Java8中,对集合类自身做了增加,增加了stream方法 -- 获取集合类的流

List<String> list = Arrays.asList("a","B","C");
Stream<String> stream - list.stream();

除此之外,还有parallelStream方法为集合创建并行流

通过Stream创建流

直接通过of方法,创建并返回一个Stream

Stream<String> stream = Stream.of("A", "B", "C");

Stream中间操作

Filter

用于通过设置条件过滤元素

List<String> list - Arrays.asList("A", "B", "C", "", "D", "");
list.stream().filter(letter -> StringUtils.isNotBlank(letter)).forEach(System.out::println);

Map

用于根据每个元素通过逻辑转换成新的值或者对象.

List<Integer> numbers = Arrays.asList(3,2,2,3,7);
List<String> stringList = numbers.stream().map(i -> String.valueOf(i)).collect(Collectors.toList());

limit/skip

limit - 返回Stream中的前面几个元素 skip - 跳过前n个元素

// limit 
List<Integer> list = Arrays.asList(3,2,2,3,7);
list.stream.limit(4).forEach(System.out::println);

sorted

用于对流进行排序

List<Integer> numbers = Arrays.asList(3,2,2,3,7);
numbers.stream().sorted().forEach(System.out::println);

默认是增序,如果需要倒序可以使用

numbers.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);

也可以自定义比较器然后进行比较。

distinct

用来去重

Stream最终操作

比如计算出流中的元素个数,转换成集合等等操作,会消耗流而产生一个最终结果。这是最终操作

forEach

迭代流中的每个数据

count

统计流中的元素个数

collect

是一个规约操作,可以转成需要的对象结构。 主要用到的是

// to List
numbers.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
// to Map
numbers.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toMap(Integer::intValue, i -> i * i));
// to String 
numbers.stream().sorted(Comparator.reverseOrder()).map(String::valueOf).collect(Collectors.joining());

里面的方法有很多,可以根据需要使用。