前言
今天来简单讲下Java8新增的Stream API。
Stream是Java8新增的对于集合框架操作的一个类,我们也称之为流操作。使用Stream,可以简化很多重复代码,使用并行流时有时还能提高程序运行效率。我们来看下。
正文
要把一个集合,List、Set或其他集合类转换为一个流,需要调用stream方法(转换为串行流)或者parallelStream方法(转换为并行流)。
Stream的常用方法如下表格介绍:
常用方法 | 说明 | 参数 | 举例 |
---|---|---|---|
filter(Predicate<? super T> predicate) | 过滤,返回一个匹配给定布尔表达式的数据流 | 一个返回值为boolean的lambda表达式 | 例1 |
map(Function<? super T, ? extends R> mapper) | 匹配,对流的每个元素都应用给定的函数以获得新流 | 任一符合条件的lambda表达式 | 例2 |
mapToInt(ToIntFunction<? super T> mapper) | 将流数据转换为IntStream流 | 流元素转为int的lambda表达式 | 例3 |
mapToLong(ToLongFunction<? super T> mapper) | 将流数据转换为LongStream流 | 流元素转为long的lambda表达式 | 略 |
mapToDouble(ToDoubleFunction<? super T> mapper) | 将流数据转换为DoubleStream流 | 流元素转为Double的lambda表达式 | 略 |
flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) | 返回一个对流的每个元素都应用给定的函数的新流。这个入参lambda包含有过滤流,此方法类似于平常的双重循环 | 一个包含过滤流的lambda表达式 | 例4 |
flatMapToInt(Function<? super T, ? extends IntStream> mapper) | 参考mapToInt | 参考mapToInt | 略 |
flatMapToLong(Function<? super T, ? extends LongStream> mapper) | 参考mapToLong | 参考mapToLong | 略 |
flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper) | 参考mapToDouble | 参考mapToDouble | 略 |
distinct() | 去除流中的重复元素 | 无参数 | 例5 |
sorted() | 对流中元素进行排序,使用自然顺序。 | 无参数 | 例6 |
sorted(Comparator<? super T> comparator) | 对流中的元素进行排序,按照指定的规则 | 流中元素的比较规则 | 例7 |
peek(Consumer<? super T> action) | 截断流后进行某些操作 | 指定的操作,无返回值lambda | 例8 |
limit(long maxSize) | 获取流中的前n个元素的流 | 限定值 | 例9 |
skip(long n) | 获取从n开始后面元素的流,不包括n,如果n超出流长度,返回一个空流 | 起始长度 | 例10 |
forEach(Consumer<? super T> action) | 循环流中的每个元素,执行指定的lambda表达式 | 无返回值的lambda表达式 | 例11 |
forEachOrdered(Consumer<? super T> action) | 按照默认顺序循环流中的元素,执行指定的lambda表达式 | 无返回值的lambda表达式 | 略 |
toArray() | 返回流中元素组成的数组 | 无参数 | 例12 |
toArray(IntFunction<A[]> generator) | 将流中元素转换为指定类型的数组,数组类型必须是流元素的本身或者超类 | 略 | 略 |
reduce(T identity, BinaryOperator<T> accumulator) | 归约,将流中的元素按照指定表达式归并。 | 起始值(默认值),指定归约公式 | 例13 |
reduce(BinaryOperator<T> accumulator) | 同上,不同的是这个没有设置起始值,故结果可能为空,返回的是Optional对象 | 指定的归约公式 | 略 |
reduce(U identity,BiFunction<U,? super T,U> accumulator,BinaryOperator<U> combiner) | 归约全参方法,可以指定初始值,归约方法,归约方式 | 略 | 例14 |
collect(Collector<? super T, A, R> collector) | 收集器,比较常用的是toList,将流元素变为集合 | 略 | 略 |
collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner) | 收集器,可以指定收集规则,收集方法等 | 略 | 略 |
min(Comparator<? super T> comparator) | 根据指定规则获取流中最小值 | 排序规则lambda表达式 | 例15 |
max(Comparator<? super T> comparator) | 根据指定规则获取流中最大值 | 排序规则lambda表达式 | 例15 |
count() | 统计流中元素数量 | 无参数 | 例16 |
anyMatch(Predicate<? super T> predicate) | 查找流中是否有元素符合条件,一旦查到,就返回true | 条件的lambda表达式 | 例17 |
allMatch(Predicate<? super T> predicate) | 查找流中的元素是否全部匹配指定表达式,全部符合才返回true | 条件的lambda表达式 | 例18 |
noneMatch(Predicate<? super T> predicate) | 查找流中的元素是否全部不匹配指定表达式,全部不匹配才返回true | 条件的lambda表达式 | 略 |
findFirst() | 查找流的第一个元素,如果流为空,返回空(Optional的空) | 无参数 | 略 |
findAny() | 随便从流中拿一个元素,如果流为空,返回空(Optional的空) | 无参数 | 略 |
empty() | 静态方法,返回一个空流 | 略 | 例19 |
of(T t) | 静态方法,生成一个元素的流 | 略 | 例19 |
of(T… values) | 静态方法,生成若干元素的流 | 略 | 例19 |
iterate(final T seed, final UnaryOperator<T> f) | 静态方法,生成一个有规律的流 | 起始值,指定的lambda表达式 | 例19 |
generate(Supplier<T> s) | 静态方法,生成指定规则的数据流,流数据的生成完全取决于lambda表达式 | 生成流数据的lambda表达式 | 例19 |
concat(Stream<? extends T> a, Stream<? extends T> b) | 静态方法,将两个数据流合并,两个流的类型须一致 | 两个数据流 | 例19 |
例子
举例:假设有一个1-100的List集合list1,50-150的List集合list2.
1 | //例1:需要一个1-100的偶数List集合。 |
结语
Java8 Stream API的一些常用方法基本如上,Stream API为操作集合类提供了更方便快捷的方式,值得我们掌握。