网站首页 > 精选教程 正文
函数式编程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
函数编程是比较难的,没有其他途径,多练练就好了。你我共勉。
- 上一篇: Java 为什么比Python运行速度快
- 下一篇: 编程语言难度排行榜出炉!Python竟然垫底?
猜你喜欢
- 2025-05-22 编程语言难度排行榜出炉!Python竟然垫底?
- 2025-05-22 Java 为什么比Python运行速度快
- 2025-05-22 PHP多久能学会?比java,python难还是简单呢?
- 2025-05-22 Java、Go 和 Python 多线程性能对比
- 2025-05-22 Java和Python哪个前景好?
- 2025-05-22 JAVA和Python哪个好
- 2025-05-22 学JAVA好?还是学Python好?
你 发表评论:
欢迎- 最近发表
-
- 我的世界光影MOD下载(我的世界光影mod下载安装)
- 我的世界1.7/1.8VoxelMap小地图MOD下载
- 我的世界1.7.10多世界 整合包(我的世界1.7.10forge整合包)
- 我的世界1.8最好用的修改器下载(我的世界1.8最好用的修改器下载安装)
- 我的世界更多弯曲动作MOD下载(我的世界更多弯曲动作mod下载手机版)
- 我的世界龙珠MOD下载(我的世界龙珠模组整合包下载)
- 我的世界1.7.10以太2 下载(我的世界以太2mod1.12.2)
- 我的世界虚拟人生MOD下载分享(我的世界虚拟人生下载安装)
- 我的世界无正版账号的简单联机方法(非网易版,仅适用于局域网)
- “我的语言极限,即是我的世界的极限。” ——《On Java》书籍推荐
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)