使用 Java 进行函数式编程 - 函数
函数是执行特定任务的语句块。函数接受数据、处理数据并返回结果。编写函数主要是为了支持可重用性的概念。函数一旦编写完毕,就可以轻松调用,而不必一次又一次地编写相同的代码。
函数式编程围绕一类函数、纯函数和高阶函数。
第一类函数是使用第一类实体(例如字符串)的函数,数字可以作为参数传递,可以返回或分配给变量。
高阶函数是一种可以将函数作为参数和/或可以返回函数的函数。
纯函数是在执行时没有副作用的函数。
一流的功能
第一类函数可以被视为变量。这意味着它可以作为参数传递给函数,它可以由函数返回,也可以分配给变量。Java 支持使用 lambda 表达式的一等函数。lambda 表达式类似于匿名函数。请参阅下面的示例 -
public class FunctionTester {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
SquareMaker squareMaker = item -> item * item;
for(int i = 0; i < array.length; i++){
System.out.println(squareMaker.square(array[i]));
}
}
}
interface SquareMaker {
int square(int item);
}
输出
1 4 9 16 25
在这里,我们使用 lambda 表达式创建了 square 函数的实现,并将其分配给变量 squareMaker。
高阶函数
高阶函数要么采用函数作为参数,要么返回函数。在Java中,我们可以传递或返回一个lambda表达式来实现这样的功能。
import java.util.function.Function;
public class FunctionTester {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
Function<Integer, Integer> square = t -> t * t;
Function<Integer, Integer> cube = t -> t * t * t;
for(int i = 0; i < array.length; i++){
print(square, array[i]);
}
for(int i = 0; i < array.length; i++){
print(cube, array[i]);
}
}
private static <T, R> void print(Function<T, R> function, T t ) {
System.out.println(function.apply(t));
}
}
输出
1 4 9 16 25 1 8 27 64 125
纯函数
纯函数不会修改任何全局变量或修改作为参数传递给它的任何引用。所以它没有副作用。当使用相同的参数调用时,它总是返回相同的值。这些函数非常有用并且是线程安全的。在下面的示例中,sum 是一个纯函数。
public class FunctionTester {
public static void main(String[] args) {
int a, b;
a = 1;
b = 2;
System.out.println(sum(a, b));
}
private static int sum(int a, int b){
return a + b;
}
}
输出
3