Java 函数式编程 - 概述

在函数式编程范式中,应用程序主要使用纯函数编写。纯函数是没有副作用的函数。副作用的一个例子是修改实例级变量,同时从函数返回值。

以下是函数式编程的关键方面。

  • 函数 − 函数是执行特定任务的语句块。函数接受数据、处理数据并返回结果。函数主要是为了支持可重用性的概念而编写的。一旦编写了函数,就可以轻松调用它,而不必一遍又一遍地编写相同的代码。

    函数式编程围绕第一类函数、纯函数和高阶函数展开。

    • 第一类函数是使用第一类实体(如字符串、数字)的函数,这些实体可以作为参数传递、返回或分配给变量。

    • 高阶函数是可以将函数作为参数和/或返回函数的函数。

    • 纯函数是执行时没有副作用的函数。

  • 函数组合 − 在命令式编程中,函数用于组织可执行代码,重点是代码的组织。但在函数式编程中,重点在于函数的组织和组合方式。通常,数据和函数作为参数一起传递并返回。这使编程更强大、更具表现力。

  • 流畅接口 − 流畅接口有助于编写易于编写和理解的表达式。当每个方法返回类型再次被重用时,这些接口有助于链接方法调用。例如 −

LocalDate futureDate = LocalDate.now().plusYears(2).plusDays(3);
  • 急切求值与惰性求值 − 急切求值意味着在遇到表达式时立即求值,而惰性求值是指延迟执行直到满足某些条件。例如,当遇到终端方法时,将评估 Java 8 中的流方法。

  • 持久数据结构

    − 持久数据结构维护其先前版本。每当数据结构状态发生变化时,都会创建结构的新副本,因此数据结构实际上保持不可变。这种不可变集合是线程安全的。
  • 递归 − 可以通过循环或更优雅地使用递归来完成重复计算。如果函数调用自身,则称为递归函数。

  • 并行性 − 没有副作用的函数可以按任何顺序调用,因此是惰性求值的候选。Java 中的函数式编程支持使用提供并行处理的流的并行性。

  • 可选 − Optional 是一个特殊的类,它强制函数永远不应返回 null。它应该使用 Optional 类对象返回值。这个返回的对象有方法 isPresent,可以检查该方法以仅在存在时获取值。