Java对比学习Pyton之高级特性:函数式编程
函数式编程java变化的比较慢,但是python却是天生支持的,非常的友好,不过不太建议嵌套太多层,太影响阅读。接下来我们来对比一下Java和Python的 函数式编程 。
一、什么是函数式编程?
函数式编程(Functional Programming)是一种将**函数作为“第一等公民”**的编程范式,强调:
- 没有副作用(pure function)
- 不修改状态(immutable data)
- 支持高阶函数(函数可以作为参数或返回值)
- 常用表达:map、filter、reduce、lambda 等
二、对比:Java vs Python 的函数式编程支持
特性 | Java | Python |
Lambda表达式 | Java 8 引入:(x) -> x * 2 | 内建支持:lambda x: x * 2 |
函数作为参数 | 通过 Function<T,R> 接口实现 | 所有函数都是一等公民 |
map/filter/reduce | Stream.map() 等 | 内建函数:map(), filter(), reduce() |
函数返回函数 | 通过嵌套函数或类实现 | 支持闭包,天然支持 |
偏函数 / 装饰器 | 需要第三方库 | 内建 functools.partial, @decorator |
代码简洁性 | 相对啰嗦 | 极其简洁 |
三、核心语法对比与示例
1.Lambda 表达式
// Java
Function<Integer, Integer> doubleFn = x -> x * 2;
System.out.println(doubleFn.apply(5)); // 输出 10
# Python
double_fn = lambda x: x * 2
print(double_fn(5)) # 输出 10
2.map() 映射操作
// Java
List<Integer> list = Arrays.asList(1, 2, 3);
list.stream().map(x -> x * 2).collect(Collectors.toList());
# Python
list(map(lambda x: x * 2, [1, 2, 3])) # 输出 [2, 4, 6]
3.filter() 过滤操作
// Java
list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
# Python
list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4])) # 输出 [2, 4]
4.reduce() 累积计算
// Java
int sum = list.stream().reduce(0, (a, b) -> a + b);
# Python
from functools import reduce
reduce(lambda a, b: a + b, [1, 2, 3, 4]) # 输出 10
5.高阶函数(函数作为参数)
java在高版本支持了么??
def operate(func, value):
return func(value)
print(operate(lambda x: x ** 2, 5)) # 输出 25
6.函数返回函数(闭包)
def power(n):
return lambda x: x ** n
square = power(2)
print(square(4)) # 输出 16
7.匿名函数
没有名字的函数,这个java和python都是支持的。
上面的例子中,返回的就是一个匿名函数
def power(n):
return lambda x: x ** n
square = power(2)
print(square(4)) # 输出 16
四、Python 特有的函数式编程能力
1.装饰器(Decorator)
在不改动函数内部逻辑的情况下“动态增强函数功能”。本质上就是:
将一个函数作为参数传递给另一个函数,并返回一个新的函数。
这个增强功能和java的面向切面很像,不过java是通过cglib或者是jdk的动态代理来实现。
def logger(func):
def wrapper(*args, **kwargs):
print("调用函数:", func.__name__)
return func(*args, **kwargs)
return wrapper
@logger
def hello():
print("Hello World")
hello()
输出:
调用函数: hello
Hello World
@符号在python和java中表达的含义不同,见下表:
项目 | Python 装饰器 | Java 注解 |
语法 | @decorator | @Annotation |
实现原理 | 函数嵌套 + 闭包 | 注解 + 编译器/运行时解析 |
应用对象 | 函数、方法、类 | 类、方法、字段等 |
应用场景 | 动态增强函数行为 | 编译检查、依赖注入、配置驱动等 |
自定义方式 | 简单灵活,函数式风格 | 需定义注解类,结合反射或注解处理器 |
Python 装饰器更偏向于 动态行为增强,而 Java 注解是 元数据标记,两者语法相似但用途不同。
2.偏函数(Partial Function)
functools模块提供的功能,其作用就是把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。类似java中的重载,同样的方法固定一个默认值后再调用一次。
functools是系统内置的函数工具,非常强大,后续会拿模块使用专门写一篇文章,敬请关注。
from functools import partial
int2 = partial(int, base=2)
print(int2('1001')) # 输出 9
函数编程是比较难的,没有其他途径,多练练就好了。你我共勉。