gpt4 book ai didi

java - 当我们返回完全相同的函数时,函数式编程中是否存在已知模式?

转载 作者:行者123 更新时间:2023-11-30 02:18:48 31 4
gpt4 key购买 nike

我是函数式方法的新手,今天我正在编写一些非常有用但非常愚蠢的简单函数。

有人可以指出我该方法的已知名称吗?

函数实现:

public static <T, R> Function<T, R> getSomething(Function<T, R> f) {
return f;
}

虚拟示例:

UserController controller = Factory.getSomething(UserController::new)
.compose(UserServiceImpl::new)
.compose(UserDaoImpl::new)
.apply(Factory.getConnection());

假设:

public class UserController {

private UserService userService;

public UserController(UserService userService) {
this.userService = userService;
}
}

public class UserServiceImpl implements UserService {

private UserDao userDao;

public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
}

public class UserDaoImpl implements UserDao {

private Connection connection;

public UserDaoImpl(Connection connection) {
this.connection = connection;
}
}

谢谢您,对我的新手问题表示歉意。

最佳答案

由于您要求“函数式编程模式”,您只需创建一个恒等函数。事实上,您限制了参数,因此限制了函数的返回类型,但这并不使它成为一种特殊的模式,至少在 FP 世界中不是这样,在 FP 世界中,函数是值,因此,将函数传递给恒等函数是值得注意的特别。

此处无法使用 Function.identity().apply(…) 的原因在于添加函数的方式(或从该角度来看尚未添加函数)对于 Java,需要一个实际的函数接口(interface)作为目标类型,并且无法通过方法调用链推断出这样的类型。由于这是 Java 特有的,因此它不能在 Java 世界之外有名称,因为真正的 FP 语言不需要这样的构造。

为了证明这一点,您可以使用

UserController controller = Function.<Function<UserService,UserController>>identity()
.apply(UserController::new)
.compose(UserServiceImpl::new)
.compose(UserDaoImpl::new)
.apply(Factory.getConnection());

相反,通过显式类型解决 Java 类型系统的问题。因此,您的自定义方法只是在此上下文中通过标识函数简化了 Java 类型系统的使用,除了使用标识函数之外,这不是一般的 FP 模式。

顺便说一句,我不认为这整个结构是对

的改进
UserController controller = new UserController(
new UserServiceImpl(new UserDaoImpl(Factory.getConnection())));

事实上,我花了几分钟才理解你的代码实际上是做什么的。所以,说到图案,这可以称为方法引用过度使用或函数构造过度使用(两者都是 Java 特定模式)。而且这种将东西包裹四次的模式可能有自己的名字......

关于java - 当我们返回完全相同的函数时,函数式编程中是否存在已知模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47486090/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com