Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用函数在函数编程中实现此功能<;T、 R>;在爪哇_Java_Design Patterns_Functional Programming - Fatal编程技术网

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的意图中说,日志可以代表返回值。