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

Java函数式编程的核心:Stream API

发布时间:2023-05-22 22:08:20

Java Stream API是Java 8中引入的一个新特性,它使得函数式编程更加轻松和可读。Stream借鉴了函数式编程中的一些思想,并为Java编程带来了很多方便性和可读性。

1. Stream API的基本概念

Stream可以理解为“流”,即一系列元素的序列,可以在其中进行各种操作,如过滤、映射、排序等等。Stream与Collection不同,它不是一个数据结构,而是一种“懒加载”的机制,只有在执行终止操作时才会进行计算和返回结果。Stream的处理过程可以分为三个阶段:创建Stream、中间操作、终止操作。

2. 创建Stream

Java 8提供了四种创建Stream的方式:

(1)通过Collection创建:List、Set、Map等

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

(2)通过数组创建:

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

(3)通过Stream.of()创建:

Stream<String> stream3 = Stream.of("a", "b", "c");

(4)通过Files.lines()创建:

Stream<String> stream4 = Files.lines(Paths.get("filename.txt"));

3. 中间操作

中间操作是指一些对Stream中的元素进行处理的操作,但并不会将处理结果返回给用户。常用中间操作包括过滤、映射、排序、去重等:

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

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.filter(i -> i % 2 == 0).forEach(System.out::println); //输出:2, 4

(2)map:用于映射Stream中的元素。

Stream<String> stream = Stream.of("apple", "banana", "pear");
stream.map(String::toUpperCase).forEach(System.out::println); //输出:APPLE, BANANA, PEAR

(3)sorted:用于排序Stream中的元素。

Stream<Integer> stream = Stream.of(5, 2, 4, 1, 3);
stream.sorted().forEach(System.out::println); //输出:1, 2, 3, 4, 5

(4)distinct:用于去重Stream中的元素。

Stream<Integer> stream = Stream.of(1, 2, 3, 2, 4, 3);
stream.distinct().forEach(System.out::println); //输出:1, 2, 3, 4

4. 终止操作

终止操作是指最终对Stream进行处理的操作,会将处理结果返回给用户。常用终止操作包括foreach、collect、reduce、count等:

(1)foreach:用于循环Stream中的元素。

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.forEach(System.out::println); //输出:1, 2, 3, 4, 5

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

Stream<String> stream = Stream.of("apple", "banana", "pear");
List<String> list = stream.collect(Collectors.toList());

(3)reduce:用于对Stream中的元素进行累加、乘积等运算。

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
int sum = stream.reduce(0, Integer::sum);
System.out.println(sum); //输出:15

(4)count:用于计算Stream中元素的个数。

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
long count = stream.count();
System.out.println(count); //输出:5

5. 示例代码

下面是一个使用Stream API的示例代码,它用于从一个List中筛选出长度大于等于5的字符串,并将它们以大写方式输出:

List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
list.stream()
  .filter(str -> str.length() >= 5)
  .map(String::toUpperCase)
  .forEach(System.out::println);

这段代码首先将List转换成Stream,然后使用filter对长度大于等于5的字符串进行过滤,使用map将这些字符串转换成大写形式,最后使用forEach逐个输出。

6. 总结

Java 8的Stream API为函数式编程带来了很多便利,使得代码更加简洁、易读。虽然需要一些学习和适应过程,但是掌握Stream API能够大大提升Java编程效率和代码质量。