盘锦做网站多少钱,广州seo网络推广员,行业网站推广外包,游戏推广怎么做目录 一、函数式编程1.1 什么是函数式编程1.2 函数式编程特征1.2.1 纯函数1.2.2 函数是一等公民 1.3 函数式编程在java中的实践 参考资料 一、函数式编程
1.1 什么是函数式编程
函数式编程#xff08;Functional Programming#xff09;是一种编程范式#xff0c;它将计算… 目录 一、函数式编程1.1 什么是函数式编程1.2 函数式编程特征1.2.1 纯函数1.2.2 函数是一等公民 1.3 函数式编程在java中的实践 参考资料 一、函数式编程
1.1 什么是函数式编程
函数式编程Functional Programming是一种编程范式它将计算视为数学函数的求值强调使用纯函数和不可变数据。 除了函数式编程之外, 还有 命令式编程声明式编程 等编程范式。 在函数式编程中函数是一等公民它可以作为参数传递给其他函数也可以作为返回值返回。函数式编程避免了副作用Side Effects和共享状态这样可以提高代码的可维护性、可测试性和并发性。
1.2 函数式编程特征
以下是函数式编程的一些主要特征
纯函数Pure Functions 函数的输出只依赖于输入不依赖于任何外部状态或可变数据。相同的输入始终产生相同的输出而且没有副作用。不可变数据Immutable Data 数据一旦被创建就不能被更改。如果需要修改数据通常会创建一个新的数据副本。函数是一等公民First-Class Functions 函数跟其它的数据类型一样处于平等地位可以被当作参数传递给其他函数也可以被作为返回值返回。高阶函数Higher-Order Functions 函数可以接受一个或多个函数作为参数并且可以返回一个函数。递归Recursion 在函数式编程中递归是一种常见的控制结构因为循环通常依赖于可变状态而函数式编程强调不可变性。Lambda 表达式 Lambda 表达式是一种匿名函数它允许在代码中直接定义简短的函数。惰性求值Lazy Evaluation 只在需要时计算表达式的值而不是在每个可能的地方都计算。模块化和组合性Modularity and Compositionality 将问题分解为小的、可复用的函数通过组合这些函数来构建更复杂的功能。 函数式编程最重要的特征是 纯函数 和 函数是一等公民 函数式编程不是一个特定语言的概念而是一种编程风格或哲学。虽然一些编程语言如Haskell、Scala、Clojure更天然地支持函数式编程但在越来越多的编程语言中如Java、JavaScript、Python也引入了函数式编程的特性。函数式编程的思想对于处理并发、提高代码可维护性和表达力都有很大的帮助。
1.2.1 纯函数
纯函数是指相同的输入总会得到相同的输出并且不会产生副作用的函数。纯函数的两个特点
相同的输入必有同输出。无副作用。无副作用 指的是函数内部的操作不会对外部产生影响如修改全局变量的值等。
举个例子
public class Person{private int a 1;public int add(int b){return a b;}public int pow(int c){return c * c;}public static void main(String[] args){Person p new Person();p.add(1);p.pow(2);}
}上面代码中add(int b)这个方法就不符合函数式编程这个函数调用后的结果不确定它的结果不仅取决于b还取决于字段a。而pow(int c)这函数就是符合函数式编程的典范只要调用它输入的值c确定了返回值就肯定确定了。
1.2.2 函数是一等公民
在编程语言中将函数视为一等公民First-Class Citizen意味着函数具有以下特性
可以赋值给变量 可以将函数赋值给变量使得函数可以像其他数据类型一样在程序中被存储和传递。可以作为参数传递 可以将函数作为参数传递给其他函数这使得函数可以参与更高阶的操作如函数的组合和转换。可以作为返回值 函数可以作为其他函数的返回值使得函数可以生成和返回其他函数。可以存储在数据结构中 函数可以存储在数组、列表、集合等数据结构中允许对函数进行组织和管理。
在支持函数作为一等公民的编程语言中函数与其他数据类型如整数、字符串等具有相同的地位可以像操作其他数据一样灵活地使用。这种特性是函数式编程风格的核心之一。
举个简单的例子假设有一个接受两个整数和一个函数作为参数的函数 operate
FunctionalInterface
public interface IntBinaryOperator {int applyAsInt(int left, int right);// 其他默认方法和静态方法...
}public class FunctionAsFirstClassCitizenExample {// 函数作为参数public static int operate(int a, int b, IntBinaryOperator operator) {return operator.applyAsInt(a, b);}// 函数作为返回值public static IntBinaryOperator getOperator(String operation) {switch (operation) {case :return (x, y) - x y;case -:return (x, y) - x - y;case *:return (x, y) - x * y;default:throw new IllegalArgumentException(Unsupported operation: operation);}}public static void main(String[] args) {// 函数赋值给变量IntBinaryOperator addition (x, y) - x y;// 函数作为参数传递int result operate(5, 3, addition);System.out.println(Result of addition: result);// 函数作为返回值IntBinaryOperator selectedOperator getOperator(*);// 调用返回的函数int result2 operate(4, 2, selectedOperator);System.out.println(Result of multiplication: result2);}}
在这个例子中IntBinaryOperator 是 Java 中的一个函数式接口用于表示接受两个整数参数并返回一个整数结果的操作。它定义了一个抽象方法 applyAsInt(int left, int right)用于执行具体的整数操作。函数 operate 接受两个整数和一个函数作为参数函数 getOperator 返回一个函数。。这展示了函数作为一等公民的特性可以方便地传递和组合。
1.3 函数式编程在java中的实践
Java 8 引入了对函数式编程的支持主要通过以下几个特性来实现 Lambda 表达式 Lambda 表达式是 Java 8 中引入的一个重要特性它使得能够以更为简洁的方式表示匿名函数。Lambda 表达式可以用来实现函数式接口只包含一个抽象方法的接口。 javaCopy code// 旧的方式使用匿名内部类
Runnable runnable1 new Runnable() {Overridepublic void run() {System.out.println(Hello, World!);}
};// 使用 Lambda 表达式
Runnable runnable2 () - System.out.println(Hello, World!);函数式接口 函数式接口是一个只包含一个抽象方法的接口。Java 8 引入了 FunctionalInterface 注解来标识函数式接口以便编译器检查。常见的函数式接口包括 Runnable、Callable、Comparator 等。 javaCopy codeFunctionalInterface
interface MyFunction {void apply();
}Stream API Stream API 提供了一种对集合进行声明式操作的方式支持函数式编程风格的数据处理。它允许对集合进行过滤、映射、归约等操作而不需要显式使用循环。 javaCopy codeListString words Arrays.asList(apple, banana, orange);// 使用 Stream 进行操作
long count words.stream().filter(word - word.length() 5).count();默认方法和静态方法 接口中引入的默认方法和静态方法使得在接口中引入新方法变得更为灵活。这对于在函数式编程中向接口添加新功能非常有用而不会破坏现有实现。 javaCopy codeinterface MyInterface {default void defaultMethod() {System.out.println(Default method);}static void staticMethod() {System.out.println(Static method);}void abstractMethod();
}Optional 类 Optional 类是 Java 8 引入的一个用于处理可能为 null 的值的容器类。它通过一系列的函数式方法来支持更安全、更函数式的处理空值的方式。 javaCopy codeOptionalString name Optional.ofNullable(getName());
String result name.orElse(Unknown);这些特性使得 Java 在某种程度上支持函数式编程范式尽管 Java 仍然是一门面向对象编程的语言。除了以上特性一些第三方库如Guava和Vavr提供了更多函数式编程支持的工具和数据类型。在 Java 9、Java 10 和 Java 11 中也进一步增强了函数式编程的支持例如引入了模块化系统和新的集合操作方法。
参考资料
什么是「函数式编程」 - 知乎 (zhihu.com)
详解Java中的三种函数式编程以及具体的实现方法 | w3cschool笔记