我对函数式编程的世界很陌生.最近我学习了关于currying和方法组合的新功能样式编程.理解使用java的函数式编程的真正本质是非常困难的,现在我有几个问题,但是,在问这些问题之前,我在python上尝试了同样的东西,现在对一些核心概念有点熟悉.
1.在java中如何Currying和方法组成不同实际上我没有看到任何差别,特别是在阅读本文之后https://dzone.com/articles/higher-order-functions
2.作为一个程序员(从我的java编程角度来看)为什么我更喜欢currying.例如,为什么我会这样做,
f(x){ return g(y) }
而不是它有f(x,y){ return x(y)}
什么区别?
我有这样的情况
@Autowired
private CustomerRepository repo;
@RequestMapping("/")
public Page<Customer> getDocuments(@Qualifier("bar") Pageable pageable,
@Qualifier("foo")Pageable pageable2)
{
return repo.findAll(pageable,pageable2.getOffset(), pageable2.getPageSize());
}
Run Code Online (Sandbox Code Playgroud)
但效果不佳。我的问题是,如何区分参数值。
为了实现上述场景,我不得不将我的方法更改为:
@RequestMapping("/")
public Page<Customer> getDocuments(Pageable pageable,
@RequestParam(value="from", defaultValue="0") int offSet,
@RequestParam(value="length", defaultValue="3") int length)
{
return repo.findAll(pageable, offSet, length);
}
Run Code Online (Sandbox Code Playgroud) 我们大多数人都了解共享可变性的后果,并且据说如果你有机会,总是更喜欢不变性(最终修饰符,设置一次,你不能改变它).我已经看到很少的编码示例,其中People实际上将字段final或setter设置为private或甚至删除类的setter(可以是DTO,Model或Entity类)和另一个类(可以将值设置为不可变的一个构建器类) class)用于创建和设置Immutable类的字段确保没有其他类能够修改状态.这似乎是我的负担.所以我想出了这个想法(下面我举一个例子)
public class TestDataClass {
private String name;
public String getName() {
return name;
}
public void setName(Supplier<String> supplier) throws Exception {
if(Objects.isNull(name))
this.name = supplier.get();
throw new Exception("This field is immutable and already has a value "+this.name);
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,你可以通过这样的setter设置值,objectOfTestDataClass.setName(() -> {return Perform_Desired_Logic;});
或者
objectOfTestDataClass.setName(() ->"My Name");
它是普通的setter.然后你也不必创建一个bulder类或使setter私有或省略setter方法
通过这种方式,一旦你将字段设置为Immutable(我不考虑反射),我也可以在实例化期间摆脱变量初始化.
我希望您的专家意见能够验证我的想法是否合法,我可以将其视为不变性吗?我错过了什么吗?在那种情况下,请纠正我.