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

标签 java if-statement java-8

我想问一下是否有不同的方法来解决我遇到的 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/

相关文章:

java - BufferedReader 循环中出现错误

java - 在java中测试长字符串

java - 在 Java 中创建文件时遇到问题

java - && (AND) 和 || (OR) 在 IF 语句中

java - 关于从同步块(synchronized block)中调用方法

java - 如何在 Tomcat 中静默删除请求?

iphone - 如果带有文本框的语句不起作用

java - 将 session 中存在的对象的值显示到jsp页面中

java - 使用 java8 stream api 来累积找到限制为 10 的索引

java - java.time中,加一个月的结果是怎么计算的?