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
广告