gpt4 book ai didi

java - 缩短带有 .contains 的 if 语句

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:52:54 25 4
gpt4 key购买 nike

我想问一下是否有不同的方法来解决我遇到的 if-else 样板情况。

每个ifelse if 都有一个string.contains 比较。我正在使用 Java 8。

有没有办法使用 x 之类的东西来缩短它?是: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
}

有没有更好的方法来解决这个问题?

~在此先感谢您的帮助。

最佳答案

我能想到的Java 8iest方案是

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));

它使用 LinkedHashMap 来保持比较顺序不变(如果相关),然后简单地搜索第一个 contains 并应用相应的函数

我想我会在实践中静态声明 map ,并将数据类的实例作为参数来保存每次执行时创建的 map 。例如如下所示。

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));
}

关于java - 缩短带有 .contains 的 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50241183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com