缩短if语句中包含.contains的语句

Ell*_*san 3 java if-statement java-8

我想询问是否有不同的方法来处理我所拥有的if-else锅炉板状况.

每一个ifelse 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)

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

〜提前感谢您的任何帮助.

zap*_*apl 6

我能想到的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)