【问题标题】:Java Functional Interface chaining around conditions围绕条件链接的 Java 功能接口
【发布时间】:2021-04-30 14:14:13
【问题描述】:

最近一直在尝试使用功能接口链接,我正在尝试了解以下是否可行。

如果我有这样的 FI:

@FunctionalInterface
public interface MyProcessor<T, R> {
    R process (T t);

    default MyProcessor<T, R> andThenProcess(MyProcessor<T, R> after) {
        Objects.requireNonNull(after);
        return (T t) -> { process(t); return after.process(t); };
    }
}

我想知道是否可以围绕检查逻辑构建流程链......所以以下是简单直接的示例

public static void main(String[] args) {

    MyProcessor<String, String> uprocessor = string -> string.toUpperCase();
    MyProcessor<String, String> lprocessor = string -> string.toLowerCase();
    MyProcessor<String, String> processor = lprocessor.andThenProcess(uprocessor);

    System.out.println(processor.process("Justin Skidmore"));

}

但我正在尝试执行以下操作,并想知道这是否合理:

MyProcessor<String, String> uprocessor = string -> string.toUpperCase();
MyProcessor<String, String> lprocessor = string -> string.toLowerCase();
MyProcessor<String, String> processor = lprocessor;

if (true) {
   processor.andThenDoThis(uprocessor);
}

System.out.println(processor.process("Justin"));

以上方法不起作用,我有点理解为什么,但有没有一种适当的方法可以让我在这里完成我想要完成的事情。我已经搜索过,但遗憾的是没有遇到过有关此问题的方案或答案。

谢谢大家。

【问题讨论】:

  • 你的代码真的可以编译吗?我看不出你的 default 方法对两个 return 语句一个接一个是有效的。而且我也无法理解R 在您的接口声明中代表什么:处理器接受T 类型的值并返回T 类型的值,那么实际上是否有必要声明R?最后,除非这是家庭作业,否则您真的应该只使用现有的 Java 类 UnaryFunction&lt;T&gt;,它提供了我认为您想要实现的行为。
  • 谢谢,我错过了返回位,已更新。是的,这是试图模仿那里的东西以更好地理解它的功课。是的,它编译并运行。
  • 这仍然无法编译,请花一些时间将其放入编辑器并用正确的可重现代码框出问题来提出您的问题

标签: java function functional-programming chaining functional-interface


【解决方案1】:

看起来您的 andThenDoThis 方法正在返回一个新实例,而不是修改现有实例。你是说

processor = processor.andThenDoThis(uprocessor);

【讨论】:

  • 这就是答案,不敢相信我错过了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2018-09-06
相关资源
最近更新 更多