您的位置:

Java Stream操作简介

Java Stream是Java 8新引入的一种处理集合数据的方式。相较于传统的集合处理方式,Java Stream操作简单、易读、易写,并且更为高效。

一、Stream的定义

Stream是Java 8中新增的一个概念,可以理解为“数据的生产线”。“生产线”的源头是一个数据源,例如集合、数组、I/O资源等。中间的每一个环节都会对数据进行加工,最后输出结果。Stream支持一系列的中间操作和最终操作,中间操作用于加工数据并可以返回一个新的Stream对象,最终操作会触发中间操作链的执行并输出结果。

二、Stream的创建

在Java 8中,Stream的创建方式有如下几种:

1. 通过Collection接口的默认方法stream()获取Stream对象


List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
Stream<String> stream = list.stream();

2. 通过Arrays中的静态方法stream()获取Stream对象


String[] array = new String[]{"Java", "Python", "PHP", "Ruby"};
Stream<String> stream = Arrays.stream(array);

3. 通过Stream中的静态方法of()获取Stream对象


Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");

4. 通过生成无限长度的Stream

Stream提供了两种方法来生成无限长度的Stream:

(1) 迭代

Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);

这里的iterate方法接收一个初始值和一个Lambda表达式,用于生成之后的元素。这里的n -> n + 2表示每个元素都是上一个元素加2,limit方法则是将Stream流限制在了10个元素以内。

(2) 生成

Stream<Double> stream = Stream.generate(Math::random).limit(10);

这里的generate接收一个Supplier类型的Lambda表达式,表示每个元素都是supplier提供的随机数。同样,limit方法也将Stream流限制在了10个元素以内。

三、Stream的中间操作

Stream提供了大量的中间操作,这里只介绍其中的一部分。

1. filter()

filter方法用于筛选元素,其接收一个Lambda表达式作为参数,表示只保留满足条件的元素。例如,筛选出所有长度大于3的元素:


Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
Stream<String> filteredStream = stream.filter(s -> s.length() > 3);

2. map()

map方法用于将元素映射为另一个元素。其接收一个Function类型的Lambda表达式作为参数,表示对每个元素都进行映射操作。例如,将所有元素转换为大写:


Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
Stream<String> mappedStream = stream.map(String::toUpperCase);

3. flatMap()

flatMap方法用于将每个元素映射为一个Stream对象,并将所有Stream对象合并为一个Stream对象。其接收一个Function类型的Lambda表达式作为参数,表示将元素映射为一个Stream对象。例如,将每个元素按照空格分割为多个单词,然后将所有单词合并为一个Stream对象:


Stream<String> stream = Stream.of("Java is cool", "Python is power", "PHP is amazing", "Ruby is fun");
Stream<String> flatMappedStream = stream.flatMap(s -> Arrays.stream(s.split(" ")));

四、Stream的最终操作

最终操作用于触发中间操作链的执行,并输出结果。

1. forEach()

forEach方法接收一个Consumer类型的Lambda表达式作为参数,表示对每个元素进行操作。例如,输出每个元素:


List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
list.stream().forEach(System.out::println);

2. toArray()

toArray方法将Stream流转换为数组。例如,将所有元素转换为大写并转为数组:


Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
String[] array = stream.map(String::toUpperCase).toArray(String[]::new);

3. reduce()

reduce方法接收一个BinaryOperator类型的Lambda表达式作为参数,表示对Stream中的所有元素进行累加操作。例如,求和操作:


Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
int sum = stream.reduce(0, (a, b) -> a + b);

五、Stream的并行处理

Stream还支持并行处理,比如使用parallel()方法将Stream转换为并行流,可以更快的处理大数据量的集合。


List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
list.parallelStream().forEach(System.out::println);

六、总结

Java Stream提供了一种简单、易读、易写的集合操作方式。通过Stream的中间操作和最终操作,可以更加灵活的处理集合数据。同时,Stream还支持并行处理,可以更加高效的处理大数据量的集合。