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

Java函数式编程中的常用函数:map、filter、reduce详解

发布时间:2023-06-10 00:37:27

函数式编程(Functional Programming,简称FP)是一种编程范式,强调的是将计算过程看成函数之间的简单交互,避免了对共享状态和可变数据的使用,从而消除了程序中的副作用,使代码更加清晰、简洁、易于理解和维护。Java 8中加入了函数式编程特性,极大地增强了Java的语言表达能力。在函数式编程中,有三个非常常用的高阶函数,它们分别是map、filter和reduce,这三个函数都是对集合进行操作的函数,也被称为“集合操作函数”。

1. map

map是指对一个集合中的每个元素都应用一个函数,然后返回一个新的集合,这个集合与原集合具有相同的大小,但包含了已被应用函数处理过的所有元素。一般我们会传入一个Lambda表达式作为处理函数来应用于每个元素。map函数是一个高阶函数,它接受一个函数作为参数,并返回一个包含每个元素应用函数后的结果的新集合。

示例代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> squares = numbers.stream()

                            .map(n -> n * n)

                            .collect(toList());

System.out.println(squares);

输出结果:

[1, 4, 9, 16, 25]

在上面的示例代码中,我们定义了一个整数列表numbers,然后对其调用了map函数,对每个元素应用了一个Lambda表达式(n -> n * n),该表达式将每个元素平方,然后返回一个新的集合squares,包含了平方值。最后,结果集合被打印出来。

2. filter

filter函数是指对一个集合中的每个元素进行过滤,根据一定的条件返回新的集合,新的集合的元素都是满足条件的元素。一般我们会传入一个Lambda表达式作为过滤函数来确定每个元素是否满足条件。filter函数同样是高阶函数,接受一个函数作为参数,并返回一个包含所有满足条件元素的新集合。

示例代码:

List<String> words = Arrays.asList("Java", "Python", "C++", "Ruby", "Go");

List<String> longWords = words.stream()

                            .filter(word -> word.length() > 3)

                            .collect(toList());

System.out.println(longWords);

输出结果:

[Java, Python, Ruby]

在上面的示例代码中,我们定义了一个字符串列表words,然后对其调用了filter函数,对每个元素应用了一个Lambda表达式(word -> word.length() > 3),该表达式判断每个元素的长度是否大于3,如果是,则把这个元素添加到新的集合longWords中。最后,结果集合被打印出来。

3. reduce

reduce函数是指对一个集合中的元素按照一定的规则进行聚合,返回一个聚合后的值。与前两个函数不同,reduce是一个终止操作,即对集合中所有元素进行操作后,最终返回一个新的数据,而不是一个新的集合。reduce函数接受两个参数:第一个是起始值,第二个是对集合中相邻的两个元素进行聚合的Lambda表达式,返回结果作为下一次聚合的第一个元素,直到聚合完整个集合。

示例代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

int sum = numbers.stream().reduce(0, (x, y) -> x + y);

System.out.println(sum);

输出结果:

15

在上面的示例代码中,我们定义了一个整数列表numbers,然后对其调用了reduce函数,给出一个初始值0,以及一个Lambda表达式(x, y) -> x + y,表示将集合中的元素相加起来。在计算过程中,起始值0被加到第一个元素1上,得到1,然后1被加到第二个元素2上,得到3,然后3被加到第三个元素3上,得到6,以此类推,直到加到最后一个元素5上,得到15,整个计算过程完毕。

综上所述,map、filter和reduce三个高阶函数是函数式编程中非常常用的集合操作函数,它们可以使我们的代码更加简单、直接、易于理解和维护。在实际应用中,我们可以结合各种集合类型、Lambda表达式和函数接口来充分发挥它们的威力。