概述
Java 8 添加了一个新的抽象概念——流(stream),它可以更加高效简洁的处理 集合 中的数据。
关于流的 特点 有:
- 不存储元素,根据需求直接进行计算。
- 流水线操作,可以在流水线上进行相关操作,流水完成就无法进行任何操作。
- 惰性执行,在流中间进行操作时,该操作会被记录,但不会执行,只有在流水完成时才会真正执行。
- 内部迭代,不需要自己写迭代的代码。
因为是流是流水线操作,在中间和结束位置都可以操作,所以流的操作分为 中间操作 和 终结操作。
中间操作:分为 无状态操作 和 有状态操作,中间操作会返回一个新的流,但只有在终结操作之后才会执行(惰性执行)。无状态操作是指对元素的处理不受之前元素的影响,有状态操作是指该操作只有拿到全部的元素才能继续进行。
终结操作:分为 非短路操作 和 短路操作,该当该流执行完后,返回最终结果。非短路操作是指必须对所有元素进行处理后才能返回结果,短路操作是指遇到某些指定条件就直接返回结果,类似于 if...return 无需处理后面的元素。
流的相关使用
创建流的方式:
直接创建:
//直接创建流
Stream<Integer> stream01 = Stream.of(1, 1, 4, 5, 1, 4);
通过集合创建:
//创建集合
List<Integer> list = new ArrayList<>();
//通过集合创建流
Stream<Integer> stream02 = list.stream();
流的中间操作:
filter
public abstract Stream<T> filter(java.util.function.Predicate<? super T> predicate)
使用 Predicate 接口,通过指定条件来过滤元素。(下面代码使用了 forEach 来输出,关于 forEach 可以看后面的终结操作)。
//直接创建流
Stream<Integer> stream = Stream.of(1, 1, 4, 5, 1, 4);
//使用filter()方法 筛选大于3的元素
stream.filter(x -> x > 3).forEach(System.out::println);
执行结果:
map
public abstract <R> Stream<R> map(java.util.function.Function<? super T, ? extends R> mapper)
使用 Function 接口,用于映射每个元素对应的结果。
//直接创建流
Stream<Integer> stream = Stream.of(1, 1, 4, 5, 1, 4);
//使用map()方法将集合的元素进行平方
stream.map(x -> x * x).forEach(x -> System.out.print(x + " "));
执行结果: