Java8新特性-Stream
原文地址:
https://juejin.cn/post/6844903646648336397#heading-0
Steam流是什么?
肤浅的理解:是对元素队列的一种逐个操作
如何使用流
- 创建 Stream:从一个数据源(如集合、数组)中获取一个流
- 中间操作:一个或多个中间操作,对数据源的数据进行处理
- 终止操作:执行中间操作链,并产生结果
创建流
- 由集合创建流
- Stream stream() : 返回一个顺序流
- Stream parallelStream() : 返回一个并行流
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
- 由数组创建流
Java8 中的 Arrays 的静态方法 stream() 可以从数组获取流:
static Stream stream(T[] array): 返回一个流
还有重载形式,能够处理对应基本类型的数组:
public static IntStream stream(int[] array)
public static LongStream stream(long[] array)
public static DoubleStream stream(double[] array)
- 由值创建流
可以使用静态方法 Stream.of(), 通过显示值创建一个流。它可以接收任意数量的参数。
public static Stream of(T… values)
- 由函数创建无限流
可以使用静态方法 Stream.iterate() 和Stream.generate(), 创建无限流。
public static Stream iterate(final T seed, final UnaryOperator f)
public static Stream generate(Supplier s)
中间操作
-
筛选
- filter()
- distinct() 去重
-
切割
- limit() 截取
- skip() 跳过
-
映射
- map()
- mapToDouble() 跟map很像,只不过映射的结果一定是要Double类型
-
排序
- sorted()
终止操作
- 查找与匹配
allMatch(Predicate p) 检查是否匹配所有元素
anyMatch(Predicate p) 检查是否至少匹配一个元素
noneMatch(Predicate p) 检查是否没有匹配所有元素
findFirst() 返回第一个元素
findAny() 返回当前流中的任意元素
count() 返回流中元素总数
max(Comparator c) 返回流中最大值
min(Comparator c) 返回流中最小值
forEach(Consumer c) 内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。相反, Stream API 使用内部迭代)
- 归约
reduce(T iden, BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 T
reduce(BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 Optional
- 收集
collect(Collector c) 将流转换为其他形式。接收一个Collector接口的实现,用于给流中元素做汇总的方法。