Java 代码中业务代码的方法入参是 Function 这种?真的合适吗?

2023-08-07 16:35:12 +08:00
 lvxiaomao

众所周知,java 提供了 Function 、Supplier 等函数式接口。

在新公司的业务代码中,入参是 Function 这种,我看了一下是因为有 2 个地方调用,这种直接调用一个封装好的方法不行吗? 否则每次看到在方法内调用这 func.get()的时候,还得返回代码入参看看具体的 function 是啥,真的好麻烦呀;

如果是提供工具类,使用函数式参数我认为是合理的,但是业务代码真的适合这样写吗?

你们的代码中有这样的入参吗?

3577 次点击
所在节点    程序员
34 条回复
nothingistrue
2023-08-07 19:03:06 +08:00
对于使用函数式接口作为参数的方法,它期望的是即时生成的匿名函数,而不是事先做好的公共组件。这种情况下,写下 func.get()的时候,它连 func 是谁都不知道,怎么可能让去找原始 Function 的代码。

函数式接口,是给你写即时匿名 Lamda 函数,不是用来定义公共函数的。你们公司这行为,明显是用错了。
jimrok
2023-08-07 19:13:20 +08:00
设计用 Function 的场景,首先要站在使用者的角度看,如果这个业务调用频率非常高,业务逻辑不固定,如果用 Interface 去实现,非常繁琐,那么就设计成 Function 会比较好,让调用者走写 lamda 会舒服很多。否则别这样设计。
nothingistrue
2023-08-07 19:15:58 +08:00
友情提示:常规的函数式接口,只能用 Lamba ,或者匿名内部类初始化,意味着该类型的变量,只能是方法内部的局部变量。不用违反常理的黑科技,压根就不能复用 Function 。
ljsh093
2023-08-07 19:49:19 +08:00
@adoal #10 目前在用 8 104
zhouhu
2023-08-07 19:49:38 +08:00
你只需要关心这个函数入参和出参
netabare
2023-08-07 21:37:20 +08:00
函数入参传个函数进来不是最基本依赖注入吗。异步框架的事件驱动和回调也大量使用了函数式接口,不知道这有什么不合适的。
e3c78a97e0f8
2023-08-08 00:00:38 +08:00
@lvxiaomao 按理说,如果 Function 是传进来的参数,那意味着这个 method 和 Function 的具体实现无关。如果你要看具体的 Function 才明白干什么,那要么是你理解有问题,要么是这个 method 抽象得不对。
dqzcwxb
2023-08-08 09:09:17 +08:00
建议去看看 Stream 实现
yoyolichen
2023-08-08 09:54:24 +08:00
stream 里不全是这玩意么 正常吧
lvxiaomao
2023-08-08 10:41:04 +08:00
@netabare #26 工具类的这么写没问题,就是业务代码感觉怪怪的。
mmdsun
2023-08-08 14:03:01 +08:00
看代码才知道设计是否合理。
通用来讲,这叫行为参数化(类似于策略设计模式)。

拿 GPT 举例说明一下:

"""
函数编程中的行为参数化是指将一个行为(或功能)作为参数传递给函数,以便在不同的上下文中执行不同的操作。这种方式可以使函数更加通用和灵活,可以根据传入的不同行为参数来实现不同的行为,而不必每次都定义新的函数。

在函数编程语言或支持函数式编程风格的编程语言中,行为参数化通常通过函数、Lambda 表达式、函数接口( Functional Interface )等实现。

// 使用不同的条件来筛选元素
filter(numbers, n -> n % 2 == 0); // 筛选偶数
filter(numbers, n -> n > 5); // 筛选大于 5 的数
"""
lvxiaomao
2023-08-08 15:02:00 +08:00
@mmdsun #31 是的,这个意思明白,但是代码中就是把这个 lambda ,当做公共方法来用的;

就是该函数入参的 function ,多处调用传入是一样的,而不是不同的; 所以感觉不合理
jaylee4869
2023-08-08 16:44:19 +08:00
你写几次 Node.js 就习惯了。
xingchenxf
2023-08-11 01:22:06 +08:00
不合理。
当代码质量高的时候,能看名达意,并且这部分代码不容易出问题,不会改动的时候,这样做合适。
但是业务代码往往质量不高,且频繁变动。这种情况下,代码用的技巧越多,最后变成一坨屎的概率越大。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/963088

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX