Java 8引入了Stream API,为集合框架提供了一种声明式处理数据的方式。Stream允许开发者以一种更简洁和可读的方式进行数据操作,如过滤、映射和归约等。本文将介绍Java Stream的基本使用方法和常见操作。
什么是Stream?
Stream是Java中的一个接口,它表示某种数据源的元素序列,并支持对这些元素进行聚合操作。与传统的迭代不同,Stream操作可以并行执行,提供了更高的性能。
创建Stream
Stream可以从各种数据源创建,例如集合、数组或生成器。以下是一些常见的创建方法:
import java.util.*;
import java.util.stream.*;
public class StreamExample {
public static void main(String[] args) {
// 从列表创建Stream
List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> streamFromList = list.stream();
// 从数组创建Stream
String[] array = {"a", "b", "c", "d"};
Stream<String> streamFromArray = Arrays.stream(array);
// 使用Stream.of方法创建Stream
Stream<String> streamOf = Stream.of("a", "b", "c", "d");
// 使用Stream.generate方法创建无限Stream
Stream<Double> streamGenerated = Stream.generate(Math::random).limit(10);
// 使用Stream.iterate方法创建无限Stream
Stream<Integer> streamIterated = Stream.iterate(0, n -> n + 2).limit(10);
}
}
中间操作
中间操作是指那些返回另一个Stream的操作,这些操作是惰性执行的,即只有在需要终端操作的结果时才会实际执行。常见的中间操作有filter、map、sorted、distinct等。
过滤(filter)
过滤操作用于排除不符合条件的元素:
List<String> strings = Arrays.asList("abc", "", "bcd", "", "defg", "jk");
List<String> filtered = strings.stream()
.filter(str -> !str.isEmpty())
.collect(Collectors.toList());
System.out.println(filtered);
映射(map)
映射操作用于将每个元素转换为另一种形式:
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> squaresList = numbers.stream()
.map(i -> i * i)
.distinct()
.collect(Collectors.toList());
System.out.println(squaresList);
终端操作
终端操作会触发Stream的实际计算,返回一个结果或副作用。常见的终端操作有collect、forEach、reduce、count等。
收集(collect)
收集操作用于将Stream转换为其他形式,例如列表、集合等:
List<String> strings = Arrays.asList("abc", "", "bcd", "", "defg", "jk");
List<String> filtered = strings.stream()
.filter(string -> !string.isEmpty())
.collect(Collectors.toList());
System.out.println(filtered);
迭代(forEach)
迭代操作用于对Stream中的每个元素执行操作:
List<String> strings = Arrays.asList("abc", "", "bcd", "", "defg", "jk");
strings.stream()
.filter(string -> !string.isEmpty())
.forEach(System.out::println);
归约(reduce)
归约操作用于将Stream中的元素组合起来:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum);
并行Stream
Stream API还提供了并行处理的能力,可以通过调用parallelStream方法创建并行Stream:
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);
并行Stream可以利用多核处理器的优势,提高处理大型数据集的性能。
总结
Java Stream API为处理集合提供了一种简洁且强大的工具。通过了解其基本用法和常见操作,我们可以编写出更高效和可读性更强的代码。在实际应用中,合理使用Stream可以显著提升代码的简洁性和运行性能。