Ell*_*san 3 java if-statement java-8
我想询问是否有不同的方法来处理我所拥有的if-else锅炉板状况.
每一个if
和else if
具有string.contains
在其中的比较.我使用的是Java 8.
有没有办法用这样的东西来缩短这个x ? y : z
?或者可能是开关?
if (s.contains("ServerAdmin ")) {
data.setServerAdmin(s) // This happens everywhere
} else if (s.contains("DocumentRoot")) {
data.setDocumentRoot(s) // This happens everywhere
} else if (s.contains("ServerName")) {
data.setServerName(s) // This happens everywhere
} else if (s.contains("ErrorLog")) {
data.setErrorLog(s) // This happens everywhere
} else if (s.contains("CustomLog")) {
data.setCustomLog(s) // This happens everywhere
} else if (s.contains("<Directory")) {
data.setDirectory(s) // This happens everywhere
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来解决这个问题?
〜提前感谢您的任何帮助.
我能想到的Java最简单的解决方案是
Map<String, Consumer<String>> map = new LinkedHashMap<>();
map.put("ServerAdmin", data::setServerAdmin);
map.put("DocumentRoot", data::setDocumentRoot);
// ...
map.entrySet().stream()
.filter(entry -> s.contains(entry.getKey()))
.findFirst()
.ifPresent(entry -> entry.getValue().accept(s));
Run Code Online (Sandbox Code Playgroud)
其中使用a LinkedHashMap
来保持比较顺序完整(如果相关),则只需搜索第一个contains
并应用相应的函数
我想我会在实践中静态地声明地图,并使数据类的实例成为一个参数,以保存每次执行的地图创建.看起来像下面的例子.
private static final Map<String, BiConsumer<Data, String>> MAP = new LinkedHashMap<>();
static {
MAP.put("ServerAdmin", Data::setServerAdmin);
MAP.put("DocumentRoot", Data::setDocumentRoot);
// ...
}
public void foo(Data data, String s) {
MAP.entrySet().stream()
.filter(entry -> s.contains(entry.getKey()))
.findFirst()
.ifPresent(entry -> entry.getValue().accept(data, s));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
160 次 |
最近记录: |