在Java中使用Stream API可以简化集合数据的处理,使代码更加简洁和功能强大。以下是12个常见的Stream用法,包括代码示例和解释:
1. 创建Stream
从集合或数组创建Stream。
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
String[] array = new String[]{"a", "b", "c"};
Stream<String> streamArray = Arrays.stream(array);
2. 过滤(Filter)
保留满足特定条件的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
3. 映射(Map)
转换流中的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> squares = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
4. 链接(FlatMap)
将流中的元素转换为另一个流,然后合并结果。
List<List<Integer>> listOfLists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4));
List<Integer> flatList = listOfLists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
5. 排序(Sorting)
对流中的元素排序。
List<String> names = Arrays.asList("John", "Jane", "Adam");
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
6. 聚合(Reduce)
将流中的元素聚合为单个值。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Integer sum = numbers.stream()
.reduce(0, (a, b) -> a + b);
7. 分区(Partitioning)
将流中的元素按照条件分区到Map中。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Map<Boolean, List<Integer>> partitioned = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
8. 收集(Collectors)
将流转换为集合或其他数据类型。
List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> collected = numbers.stream()
.collect(Collectors.toList());
9. 统计(Statistics)
获取流中元素的统计信息。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
IntSummaryStatistics stats = numbers.stream()
.mapToInt(Integer::intValue)
.summaryStatistics();
10. 任意/第一个/所有匹配(AnyMatch/FindFirst/AllMatch)
检查流是否包含至少一个、第一个或所有元素满足条件。
List<Integer> numbers = Arrays.asList(1, 2, 3);
boolean containsEven = numbers.stream().anyMatch(n -> n % 2 == 0);
Optional<Integer> first = numbers.stream().findFirst();
boolean allPositive = numbers.stream().allMatch(n -> n > 0);
11. 并行流(Parallel Streams)
并行处理流中的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long sum = numbers.parallelStream().reduce(0L, Long::sum);
12. 限制和跳过(Limit/Skip)
限制流中的元素数量或跳过前几个元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limited = numbers.stream()
.limit(3)
.collect(Collectors.toList());
List<Integer> skipped = numbers.stream()
.skip(2)
.collect(Collectors.toList());
这些例子展示了如何使用Stream API来处理各种数据操作。你可以根据需要将多个操作链式调用,创建出非常灵活的数据处理流程。