网站首页 > 文章精选 正文
函数式编程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
函数编程是比较难的,没有其他途径,多练练就好了。你我共勉。
猜你喜欢
- 2025-06-28 java 9新特性 模块化系统(java新版本新特性)
- 2025-06-28 JAVA大集群下的负载均衡之道(java负载均衡是什么意思)
- 2025-06-28 Java Lambda表达式详解(java的lambada表达式)
- 2025-06-28 Java 中的 volatile 关键字(java volatile 例子)
- 2025-06-28 java ArrayList类详解及Vector类简介
- 2025-06-28 Java面试必备八股文(java面试必备八股文案例)
- 2025-06-28 仓颉、Java、Golang性能测试——数组扩容
- 2025-06-28 怎么求第K大的数,topK 问题(快排的应用)java
- 2025-06-28 轻松掌握 Java 变量:编程世界的存储小能手
- 2025-06-28 java采用int32作为hashcode,会不会出现更高的碰撞概率?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)