Java函数式编程的核心:Stream API
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编程效率和代码质量。
