java - 迭代方法列表并获取第一个非空响应
问题描述
我有三个功能。三个函数的输入输出参数相同。
比方说
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;
}
- 这是过度工程吗?
- 有没有更好的方法来处理这个用例?
解决方案
您可以利用 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 小提琴
推荐阅读
- python - 用 Python 开发 A* 算法
- llvm - 修补 llvm-project
- python-3.x - python - 如何在没有“if”或列表或字典的情况下返回基于整数的字符串
- javascript - 我正在捕获 chrome 扩展 xhr 请求,但没有获得返回值
- javascript - nodejs连接中的XMLHttpRequest与javascript错误
- reactjs - 我将如何使用 usecontext 进行搜索栏过滤
- php - PHPOfficePhpSpreadsheet 找不到空单元格(没有值或 0)
- image - 将图片放在乳胶中
- c++ - ifstream 不会读取嵌套循环
- ethereum - Ropsten 测试网络的 Solidity - 未捕获的错误:无效地址