Java 8 Stream API详解
Java 8 Stream API提供了强大的数据处理能力,极大地简化了集合操作。本文将详细介绍Stream的基本概念、创建方法、流操作及其应用实例。
流的简介
Java 8引入了Stream API,它允许以声明式的方式对集合进行各种复杂的数据处理操作。Stream不存储数据,而是通过一系列操作来生成结果,这些操作可以是过滤、映射、排序等。Stream支持并行操作,非常适合现代多核处理器环境下的高效计算。
创建Stream
使用集合创建流
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); // 获取顺序流
Stream<String> parallelStream = list.parallelStream(); // 获取并行流
使用数组创建流
int[] arr = {1, 2, 3, 4};
IntStream stream = Arrays.stream(arr);
使用静态方法创建流
Stream<Integer> stream1 = Stream.of(1, 2, 3);
Stream<Integer> stream2 = Stream.iterate(0, n -> n + 2).limit(5); // 从0开始,每次加2,限制长度为5
Stream<Double> stream3 = Stream.generate(Math::random).limit(3); // 随机数流,限制长度为3
中间操作与终端操作
中间操作(如filter, map, sorted)会返回一个新的流,并且是惰性求值的。只有当执行终端操作(如forEach, collect, reduce)时,才会触发整个流的操作链。
过滤与映射
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().filter(n -> n > 2).map(n -> n * 2).forEach(System.out::println);
排序
List<String> names = Arrays.asList("apple", "banana", "pear");
names.stream().sorted().forEach(System.out::println);
收集结果
使用collect方法可以将流的结果收集到不同的集合中,例如列表、集合或映射表。
List<String> fruits = Arrays.asList("apple", "banana", "orange");
Map<Integer, String> map = fruits.stream().collect(Collectors.toMap(String::length, s -> s));
System.out.println(map);
统计与分组
利用Collectors提供的工具类,可以方便地进行统计和分组。
List<Person> people = ...;
double averageAge = people.stream().collect(Collectors.averagingInt(Person::getAge));
Map<String, List<Person>> groupedByGender = people.stream().collect(Collectors.groupingBy(Person::getGender));
归约操作
归约操作可以通过reduce方法实现,用于计算总数、乘积或其他聚合值。
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
Optional<Integer> sum = nums.stream().reduce(Integer::sum);
System.out.println(sum.orElse(0));