目录
前言:
Stream分为源source,中间操作,终止操作。流的源可以是一个数组、一个集合、一个生成器方法、一个IO通道等等。一个流可以有零个或多个中间操作、每一个中间操作都会返回一个新的流,供下一个操作使用。一个流只会有一个终止操作。
到底如何区分中间操作和终止操作,中间操作的入参到底如何写。
一、中间操作
返回值类型仍然是 Stream 接口自身类型的方法(除了终止操作外,其余方法均为中间操作)
常用API
- 过滤filter
- 去重distinct
- 排序sorted
- 截取limit、skip
- 转化map、flatMap
- 其他peek
二、终止操作
返回值类型不再是 Stream 接口自身类型的方法。
常用API
- 循环forEach
- 计算min、max、count、average
- 匹配anyMatch、allMatch、noneMatch、findFirst、findAny
- 汇聚reduce
- 收集器toArray、collect
三、Stream中间操作使用的灵魂-函数式接口
之前一直没有搞清楚中间操作常用api中的入参到底该怎么写,想要知道怎么写得了解下面的常用函数式接口,中间操作的入参大都是这些函数式接口,而我们的入参是实现这些函数式接口的行为
- Suppiler 代表一个输出
- Consumer代表一个输入
- BiConsumer 代表两个输入
- Function代表一个输入一个输出(一般输入和输出类型不同)
- UnaryOperator代表一个输入一个输出(输入和输出类型相同)
- Predicate 代表一个输入一个输出(接受一个输入参数 ,返回一个布尔值结果)
- BiFunction 代表两个输入、一个输出(一般输入和输出类型不同)
- BinaryOperator 代表两个输入一个输出(输入和输出类型相同)
- 其他函数式接口见Java 8 函数式接口 | 菜鸟教程
举个例子比如中间操作map
/**
* Returns a stream consisting of the results of applying the given
* function to the elements of this stream.
*
* <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
*
* @param <R> The element type of the new stream
* @param mapper a <a href="package-summary.html#NonInterference">non-interfering</a>,
* <a href="package-summary.html#Statelessness">stateless</a>
* function to apply to each element
* @return the new stream
*/
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
看下入参不难发现,入参是函数式接口Function,代表一个输入,一个输出(一般输入和输出类型不同)类型根据自己需要来指定,如下例:一个输入为String类型,一个输出为Integer类型
public static void main(String[] args) {
Stream<String> original = Stream.of("100", "200", "300");
Stream<Integer> result = original.map(str -> Integer.parseInt(str));
result.forEach(System.out::println);
}