欢迎访问宙启技术站
智能推送

Java函数式编程:如何使用StreamAPI?

发布时间:2023-06-10 13:35:27

Java 8引入了一种新的编程范式——函数式编程(Functional Programming)。其中Stream API是函数式编程中最核心的概念之一,它是处理集合数据的一种高效、简洁且可复用的方式。

Stream API可以看做是对Java集合类的函数式扩展,它提供了一系列针对集合的函数式操作,例如过滤、查找、映射、聚合等。使用Stream API可以简化集合的处理过程,提高代码的可读性和复用性。

下面介绍一下如何使用Stream API。

1.创建Stream

Stream API可以通过集合、数组、文件等方式创建Stream。示例代码如下:

List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();

String[] arr = {"a", "b", "c"};
Stream<String> stream2 = Arrays.stream(arr);

Stream<String> stream3 = Files.lines(Paths.get("file.txt"));

2.中间操作(Intermediate Operations)

Stream API提供了多种中间操作,用于对Stream进行转换、过滤、映射等处理,这些操作不会改变原有的Stream,而是返回一个新的Stream。中间操作包括:

过滤(Filter):用于过滤Stream中不符合条件的元素。

List<String> list = Arrays.asList("a", "ab", "abc", "abcd");
Stream<String> stream = list.stream().filter(s -> s.length() > 2); // 只返回长度大于2的元素

映射(Map):用于将Stream中的元素进行转换,返回一个新的Stream。

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream().map(String::toUpperCase); // 将元素转换成大写

去重(Distinct):用于去除Stream中重复的元素。

List<String> list = Arrays.asList("a", "b", "c", "a", "b", "c");
Stream<String> stream = list.stream().distinct(); // 去除重复元素

限制(Limit):用于限制Stream中元素的个数。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> stream = list.stream().limit(3); // 返回前三个元素

跳过(Skip):用于跳过Stream中的前n个元素。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> stream = list.stream().skip(3); // 跳过前三个元素

排序(Sorted):用于对Stream中的元素进行排序。

List<String> list = Arrays.asList("d", "a", "c", "b", "e");
Stream<String> stream = list.stream().sorted(); // 按照自然顺序排序

3.终端操作(Terminal Operations)

终端操作是Stream API中最重要的操作,它们会触发Stream的处理,生成一个结果或副作用。终端操作包括:

计数(Count):用于获取Stream中元素的个数。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
long count = list.stream().count(); // 获取元素个数

查找(Find):用于查找符合条件的第一个元素或者任意一个元素。

List<String> list = Arrays.asList("a", "ab", "abc", "abcd");
Optional<String> result1 = list.stream().filter(s -> s.startsWith("a")).findFirst(); // 查找以"a"开头的第一个元素
Optional<String> result2 = list.stream().filter(s -> s.startsWith("a")).findAny(); // 查找以"a"开头的任意一个元素

匹配(Match):用于判断Stream中的元素是否符合条件。

List<String> list = Arrays.asList("a", "ab", "abc", "abcd");
boolean result1 = list.stream().allMatch(s -> s.length() > 1); // 所有元素都长度大于1返回true
boolean result2 = list.stream().anyMatch(s -> s.length() > 2); // 存在元素长度大于2返回true
boolean result3 = list.stream().noneMatch(s -> s.length() == 2); // 所有元素长度不等于2返回true

归约(Reduce):用于将Stream中的元素进行累加、累乘、拼接等运算。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> result1 = list.stream().reduce(Integer::sum); // 对所有元素求和
int result2 = list.stream().reduce(0, (a, b) -> a + b); // 对所有元素求和(指定初始值)

收集(Collect):用于将Stream中的元素收集到一个集合中。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
List<String> result1 = list.stream().collect(Collectors.toList()); // 转换成List
Set<String> result2 = list.stream().collect(Collectors.toSet()); // 转换成Set
Map<String, Integer> result3 = list.stream().collect(Collectors.toMap(Function.identity(), String::length)); // 转换成Map(Key为原始元素,Value为元素长度)

4.并行流(Parallel Stream)

Stream API还提供了并行流的支持,可以将Stream并行处理,以提高处理效率。示例代码如下:

List<Integer> list = IntStream.range(1, 1000000).boxed().collect(Collectors.toList());
long start = System.currentTimeMillis();
int result1 = list.stream().mapToInt(Integer::intValue).sum();
long end1 = System.currentTimeMillis();
int result2 = list.parallelStream().mapToInt(Integer::intValue).sum();
long end2 = System.currentTimeMillis();
System.out.println("串行流用时:" + (end1 - start));
System.out.println("并行流用时:" + (end2 - end1));

在上面的代码中,分别使用串行流和并行流对100万个数字进行求和,可以看到并行流的处理速度要比串行流快很多。

以上就是关于Java Stream API的简单介绍和使用方法,希望能对大家有所帮助。