1 简介
Stream API (java.util.Stream
)将集合和数组抽象成流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
Stream操作主要有三个步骤:
- 1.创建Stream
一个数据源(集合、数组),获取一个流。 - 2.中间操作
中间操作链,对数据源的数据进行处理:筛选, 排序等。 - 3.终止操作
执行终止操作时才会执行中间操作链,且一个流执行只能执行一次终止操作。
2 创建Stream
- 数组创建流
Arrays.stream(T[] array)
:返回Stream<T>
,对于基本类型数组(int, long, double),返回IntStream
、LongStream
、DoubleStream
- 集合创建流
stream()
: 集合对象调用该方法创建串行流
3 中间操作
filter(Predicate predicate)
:过滤掉返回false的元素distinct()
:筛选,通过hashCode()和equals()出去重复元素limti(long maxSize)
:断截流,使其元素不超过给定数量skip(long n)
:返回跳过前n个元素的流map(Function mapper)
:每个元素通过Function函数式接口,映射成另一个元素mapToXxx(ToXxxFunction mapper)
: 元素映射,产生新的流XxxStreamsorted(Comparator com)
:元素排序,产生新的流,如未输入参数,则按自然排序。
除了上述操作,对于IntStream
等还有的操作:
boxed()
:对基本类型“装箱”average()
:对元素求平均sum()
:对元素求和
4 终止操作
foreach(Consumer action)
:迭代操作流的每个元素count()
:返回流中元素总数max(Comparator c)
:返回流中最大值min(Comparator c)
:返回流中最小值reduce(BinaryOperator accumulator)
:将流中元素反复结合起来,得到一个值(Optional<T>
)toArray(IntFunction<A[]> generator)
:不带generator参数时将流元素存入Object[]
,带参数时存入A[]
:
toArray(size -> new A[size]) // 结果返回 A[] 数组
toArray(A[]::new) // 与上面等价
collect(Collector c)
:将流转化为其他形式(汇总)常见的Collector由
Collectors
提供:toList()
-->List<T>
:把流中元素收集到ListtoSet()
-->Set<T>
:把流中元素收集到SettoMap()
-->Map<K, V>
:把流中元素收集到Map
5 示例
示例一:随机生成长度为10范围在[10, 20)的int[]数组:
Random rand = new Random();
int[] arr = rand.ints(10, 20).limit(10).toArray();
示例二:int[]数组 ----> List<Integer> 集合
// int[] --> List<Integer>
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
System.out.println("---------- int[] --> List<Integer> -----------------");
list.forEach(System.out::println);
示例三:List<Integer>集合 —> Integer[]数组
// List<Integer> --> Integer[]
Integer[] arr2 = list.stream().toArray(Integer[]::new);
System.out.println("---------- List<Integer> --> Integer[] -----------------");
Arrays.stream(arr2).map(item -> item+", ").forEach(System.out::print);
System.out.println();
示例四:List<Integer>集合 ----> int[]数组
// List<Integer> --> int[]
int[] arr3 = list.stream().mapToInt(Integer::valueOf).toArray();
System.out.println("---------- List<Integer> --> int[] -----------------");
Arrays.stream(arr3).mapToObj(item -> item+", ").forEach(System.out::print);
示例四:控制台输入一行数据转 int[]数组
// 输入格式为 1, 2, 3, 4, 5, 6 得到 int[] data
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
scanner.close();
String[] strs = input.replace(",", " ").split("\s+");
int[] data = Arrays.stream(strs).map(String::trim).mapToInt(Integer::valueOf).toArray();
// 按照 1, 2, 3, 4, 5, 6格式打印输出
Arrays.stream(data).limit(data.length-1).mapToObj(item -> item+", ").forEach(System.out::print);
System.out.println(data[data.length-1]);