Java Stream流是Java 8引入的一种新特性,旨在以一种简洁、高效的方式对集合进行处理。Stream流是对集合功能的一种增强,它允许以声明性方式处理数据集合,借助流的操作可以轻松实现过滤、映射、排序、聚合等操作。
什么是Stream流
Stream流并不是数据结构,而是对数据源(如集合、数组等)进行操作的业务逻辑。Stream可以极大地方便我们进行数据处理,并提供了高性能和并行处理的能力。我们可以使用Stream来实现函数式编程风格的操作,代码更加简洁明了。
创建Stream流
Java中可以通过多种方式创建Stream流,下面是一些常见的创建方式:
- 从集合创建
- 从数组创建
- 通过Stream.of()方法
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
// 从集合创建
List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> streamFromList = list.stream();
// 从数组创建
String[] array = {"e", "f", "g"};
Stream<String> streamFromArray = Arrays.stream(array);
// 使用Stream.of()方法
Stream<String> streamOf = Stream.of("h", "i", "j");
}
}
Stream流的常用操作
Java Stream流支持多种操作,这些操作通常分为中间操作和终止操作。
1. 中间操作
中间操作返回的是一个新的Stream流,这些操作是惰性求值的。常用的中间操作有filter、map、distinct等。
- filter:过滤流中的元素。
- map:对每个元素应用一个函数并返回一个新流。
- distinct:去重。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamOperationsExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana");
List<String> distinctFruits = list.stream()
.distinct()
.collect(Collectors.toList());
System.out.println("去重后的水果列表: " + distinctFruits);
// 使用filter过滤出包含字母'a'的水果
List<String> filteredFruits = list.stream()
.filter(fruit -> fruit.contains("a"))
.collect(Collectors.toList());
System.out.println("过滤后包含'a'的水果: " + filteredFruits);
// 使用map将每个水果转换为大写
List<String> upperCaseFruits = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println("大写水果列表: " + upperCaseFruits);
}
}
2. 终止操作
终止操作会产生一个结果或副作用,常用的终止操作有forEach、count、collect、reduce等。
- forEach:对流中的每个元素进行操作。
- count:计算流中的元素数量。
- collect:将流中的元素收集到集合中。
- reduce:对流中的元素进行聚合操作。
import java.util.Arrays;
import java.util.List;
public class StreamTerminalOperationsExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用forEach打印每个数字
System.out.println("每个数字:");
numbers.stream().forEach(System.out::println);
// 使用count计算元素数量
long count = numbers.stream().count();
System.out.println("数字的数量: " + count);
// 使用reduce计算总和
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println("数字的总和: " + sum);
}
}
并行处理
Stream流还支持并行处理,使用parallelStream()
方法可以很方便地实现流的并行操作,充分利用多核处理器的优势。
public class ParallelStreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.parallelStream()
.reduce(0, Integer::sum);
System.out.println("并行计算的总和: " + sum);
}
}
总结
Java Stream流为我们提供了一种高效、简洁的处理集合的方法。通过Stream流,我们可以使用函数式编程的理念,轻松实现复杂的数据处理逻辑。随着对流的深入理解,我们能更好地利用其优势,实现更高效的代码。