Java函数式编程中的Stream API应用
Java 8中引入的Stream API是一种函数式编程的范例。该API可以帮助我们轻松地对集合数据进行流式操作,从而更好地利用CPU和内存资源。在本文中,我们将探讨Java函数式编程中的Stream API应用。
什么是Java Stream API?
Stream是Java 8中的一项新特性,它提供了一种新的方式来处理集合数据。Stream API是一种基于函数式编程风格的API,它允许我们在一组数据中流式操作,而不是像传统方法那样使用迭代器来遍历它们。
Stream API是一种惰性求值的方式,它只有在需要输出最终结果时才执行操作,这样可以减少计算时间和内存占用。
Stream中的常见操作
Stream API中有两种操作:中间操作和终端操作。
中间操作是对Stream对象进行转换和处理的方法,这些方法返回一个新的Stream对象。例如filter()、map()和distinct()等方法。
终端操作是执行最终操作的方法,它们返回一个非Stream的结果,例如collect()、count()和forEach()等方法。
示例1:对集合中的数字进行平方和计算
List<Integer> nums = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
int sum = nums.stream()
.map(n -> n * n)
.reduce(0, Integer::sum);
System.out.println(sum);
输出结果:84
示例2:对字符串数组进行筛选和排序
String[] names = {"Alfredo", "Charlie", "Tina", "Tim", "Bruce"};
List<String> startWithT = Arrays.stream(names)
.filter(name -> name.startsWith("T"))
.sorted()
.collect(Collectors.toList());
System.out.println(startWithT);
输出结果:[Tina, Tim]
示例3:对集合中的对象进行筛选和计数
List<Person> persons = new ArrayList<>();
persons.add(new Person("John", 30));
persons.add(new Person("Tom", 25));
persons.add(new Person("Peter", 40));
persons.add(new Person("David", 35));
long count = persons.stream()
.filter(person -> person.getAge() >= 30)
.count();
System.out.println("Number of persons with age 30 and above: " + count);
输出结果:Number of persons with age 30 and above: 3
以上三个示例展示了Stream API在集合处理中的常见应用。从上面的代码中,我们可以看到Stream API的易用性和优雅性,让我们的代码更加简洁清晰。
Stream API中的并行操作
Stream API还支持并行操作,这意味着在多个线程中同时执行操作,从而加速处理速度。要使用并行操作,只需要在Stream调用时添加parallel()方法即可。
示例4:对集合中的数字进行平方和计算(使用并行操作)
List<Integer> nums = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
int sum = nums.parallelStream()
.map(n -> n * n)
.reduce(0, Integer::sum);
System.out.println(sum);
输出结果:84
在这个例子中,我们只需在Stream的头部添加parallel()方法即可实现并行化计算,并发运行数由JVM自动处理。
总结
Stream API是Java 8引入的一项强大的函数式编程工具,它提供了一种优雅的方式处理集合数据。在我们的日常开发工作中,必须熟练掌握Stream API中的常见操作和并行操作,才能更好地发挥函数式编程的优势。
