Java 8引入了Stream API,它为集合类提供了一种新的操作方式。Stream API不仅让代码更加简洁和可读,还提供了并行处理的能力,从而提高性能。本文将深入探讨Stream API的一些高级用法,并通过实际示例展示如何利用这些功能来优化代码。
流的创建 流可以从集合、数组等多种数据源创建。例如,从List创建流:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
过滤与映射
使用filter
方法可以对流中的元素进行筛选,而map
则用于转换流中的每个元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squared = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.collect(Collectors.toList());
收集结果
collect
方法用于将流中的元素收集到集合中。常用的收集器包括Collectors.toList()
、Collectors.toSet()
等。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Set<String> uniqueNames = names.stream()
.map(String::toLowerCase)
.collect(Collectors.toSet());
聚合操作
聚合操作如sum
、average
、max
、min
等可以帮助我们快速计算流中元素的统计信息。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
Optional<Integer> max = numbers.stream().max(Integer::compare);
并行流 并行流允许在多核处理器上并行处理数据,从而提高性能。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int parallelSum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
Optional
对象,它可以避免空指针异常。Predicate
、Function
等。forEach
、collect
这样的操作会触发流的执行,称为终端操作。