Java 如何使用函数在函数编程中实现此功能<;T、 R>;在爪哇
我有一个场景,在命令式编程中是这样的Java 如何使用函数在函数编程中实现此功能<;T、 R>;在爪哇,java,design-patterns,functional-programming,Java,Design Patterns,Functional Programming,我有一个场景,在命令式编程中是这样的 processEvent(Event event) { if ( isEventOfSpecificType(event) ){ .............................................. 1 Result result = findSomeData(event.someProperty()) ............................. 2 if(result.someStatus
processEvent(Event event) {
if ( isEventOfSpecificType(event) ){ .............................................. 1
Result result = findSomeData(event.someProperty()) ............................. 2
if(result.someStatus == somevalue) { ........................................... 3
saveEvent(event, result) // save to DB with properties from both objects ... 4
String referenceID = createSomeRecord(event, result) // Will do API call ... 5
writeToLogFile(event, result, referenceID) // write to a logfile ........... 6
}
}
}
我试图用函数、谓词、使用者和提供者来理解JAVA中的函数编程
我的第一个想法是:使用流来利用过滤器和映射,但是由于在这个场景中没有集合,所以似乎不适合为一个对象创建流
我的第二个想法是:使用函数和咖喱,但我迷路了。因为我在最后一步中需要所有三个对象,所以我的头无法绕过它
如何以功能性的方式实现这一点。理解本主题的最佳参考资料有哪些。您可以使用可选API编写上述代码,但需要遵循函数式编程方法 函数式编程(通常缩写为FP)是通过组合纯函数、避免共享状态、可变数据和副作用来构建软件的过程。函数式编程是声明式的,而不是命令式的,应用程序状态通过纯函数流动。与面向对象编程不同,在面向对象编程中,应用程序状态通常与对象中的方法共享和共同定位 纯函数是指以下函数:
- 给定相同的输入,总是返回相同的输出,并且
- 没有副作用
public void processEvent(final Event event) {
Optional.of(event)
.filter(this::isEventOfSpecificType)
.map(e -> findSomeData(e.someProperty()))
.ifPresent(r -> resultBiConsumer.accept(r, event));
}
private BiConsumer<Optional<Result>, Event> resultBiConsumer = (result, event) -> {
if(result.isPresent()) {
Result r = result.get();
if(r.getStatus() == 0) {
saveEvent(event, r);
String referenceID = createSomeRecord(event, r);
writeToLogFile(event, r, referenceID);
}
}
};
public void processEvent(最终事件){
可选。of(事件)
.filter(此::isEventOfSpecificType)
.map(e->findSomeData(e.someProperty()))
.ifPresent(r->resultBiConsumer.accept(r,事件));
}
私有双消费者resultBiConsumer=(结果、事件)->{
if(result.isPresent()){
Result r=Result.get();
if(r.getStatus()==0){
saveEvent(event,r);
字符串referenceID=createSomeRecord(事件,r);
writeToLogFile(事件、r、引用ID);
}
}
};
关于函数式编程中为什么不变性很重要的Java代码块。
在这里使用
函数(或流
)没有任何意义。您需要了解什么工具对什么目的有用。Java不是函数式编程语言,而函数
接口也不是函数式编程语言。将其转换为函数式风格的第一步是让processEvent
计算一个值。它的计算值是多少?“处理事件”的最终结果是什么?也许您在方法末尾生成的日志行应该是返回值?@Joni Hello,将操作代码转换为使用者
可能是一个有效的选项?@dariosicily您的意思是使用者事件消费者=this::processEvent
?这并没有使代码比它已经具有的功能更强大is@Joni是的,因为OP在帖子中指定了消费者,除非你在OP的意图中说,日志可以代表返回值。