首页 > 解决方案 > 迭代方法列表并获取第一个非空响应

问题描述

我有三个功能。三个函数的输入输出参数相同。

比方说

public void String function1(String abc, String xyz);
public void String function2(String abc, String xyz);
public void String function3(String abc, String xyz);

我有一个调用函数,它的实现方式如下

public void String callerFunction(String abc, String xyz) {
     String output = function1(String abc, String xyz);
     if(output == null) { 
          output = function2(String abc, String xyz);
     } 
     
     if(output == null) { 
          output = function3(String abc, String xyz);
     } 
     return output;
}

虽然这段代码有效,但编写这种逻辑的最佳方式是什么,我将来可能还想添加一个新函数4。

我想到的一种方法是

public interface functionInterface {
      public String fetchValue(String abc, String xyz);
} 

public class function1Class {
      public String fetchValue(String abc, String xyz) {
         // return some string.
      }
} 

public class function2Class {
      public String fetchValue(String abc, String xyz) {
         // return some string.
      }
} 

public class function3Class {
      public String fetchValue(String abc, String xyz) {
         // return some string.
      }
}


public void String callerFunction(String abc, String xyz) {
     List<functionInterface> flist = new Arraylist<>();
     functionInterface f1 = new function1Class();
     functionInterface f2 = new function1Class();
     functionInterface f3 = new function1Class();
     flist.add(f1);
     flist.add(f2);
     flist.add(f3);
     
     String output = null;
     for(functionInterface f : flist) { 
         output = f.fetchValue(abc, xyz);
         if(f.fetchValue(abc, xyz) != null) {
            return output;
         }
     }
     return output;
}

标签: javadesign-patterns

解决方案


您可以利用 Java 流的惰性来执行此操作。在下文中,当其中一个函数已经返回非空结果时,并非所有函数都会被调用:

import java.util.Arrays;
import java.util.function.BinaryOperator;

class Main {

  public static void main(String[] args) {
    
    BinaryOperator<String> f1, f2, f3;
    f1 = (a, b) -> {
      System.out.println("Calling f1");
      // your logic here
      return null;
    };

    f2 = (a, b) -> {
      System.out.println("Calling f2");
      // your logic here
      return "222";
    };

    f3 = (a, b) -> {
      System.out.println("Calling f3");
      // your logic here
      return "333";
    };

    String a = "aaa";
    String b = "bbb";

    String ret = Arrays.asList(f1, f2, f3)
                       .stream()
                       .map(f -> f.apply(a, b))
                       .filter(v -> v != null)
                       .findFirst()
                       .get()

    System.out.println(ret);
  }
}

通过将函数作为数组提供,您可以随时添加新函数。

在repl.it上玩的 Java 小提琴


推荐阅读