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

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可以让我们更加优雅地进行集合处理,代码可读性和可维护性也会得到提高。