Java函数式编程高级特性:Stream操作
发布时间:2023-06-07 22:34:35
Stream是Java 8引入的一个重要特性,它可以帮助我们更快地对集合进行操作。Stream的实现方式是通过使用lambda表达式来进行函数式编程,可以在不修改原有集合的基础上,对集合进行各种操作,如筛选、映射、排序、归约等。
Stream的操作可以分为两类:中间操作和最终操作。中间操作返回一个新的Stream对象,可以对该对象进行连续的操作。最终操作是对Stream的一个终止操作,通常会生成一个结果(如List、Set、Map或者一个简单的值)。
1. 筛选
Stream提供了filter()方法,用来筛选集合中符合条件的元素,返回一个新的Stream对象,该对象只包含符合条件的元素。例如:
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Stream<Integer> evenNums = nums.stream().filter(n -> n % 2 == 0);
2. 映射
Stream提供了map()方法,用来将集合中的每个元素进行映射,返回一个新的Stream对象,该对象包含映射后的元素。例如:
List<String> words = Arrays.asList("hello", "world", "java", "stream");
Stream<Integer> wordLengths = words.stream().map(String::length);
3. 排序
Stream提供了sorted()方法,用来对集合中的元素进行排序,返回一个新的Stream对象,该对象包含排好序的元素。例如:
List<Integer> nums = Arrays.asList(3, 1, 4, 2, 5); Stream<Integer> sortedNums = nums.stream().sorted();
此外,还可以通过传递一个Comparator对象来指定排序方式:
Stream<Integer> reverseSortedNums = nums.stream().sorted(Comparator.reverseOrder());
4. 归约
归约操作可以将一个Stream对象中的所有元素通过某种操作累加或者合并为一个值。Stream提供了reduce()方法,用来对集合中的元素进行归约操作,返回一个包含归约结果的Optional对象。例如:
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5); Optional<Integer> sum = nums.stream().reduce((x, y) -> x + y);
5. 统计
Stream提供了一些基本的统计操作,包括求和、平均值、最小值、最大值。例如:
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5); int sum = nums.stream().mapToInt(Integer::intValue).sum(); OptionalDouble avg = nums.stream().mapToDouble(Integer::intValue).average(); OptionalInt max = nums.stream().mapToInt(Integer::intValue).max(); OptionalInt min = nums.stream().mapToInt(Integer::intValue).min();
以上就是一些常用的Stream操作,使用Stream可以让我们更加优雅地进行集合处理,代码可读性和可维护性也会得到提高。
