用于检查for循环内部条件的最短代码

xyb*_*rek 0 java

这段代码的最短形式是什么?

List<String> supported = Arrays.asList("...");
boolean isSupported = false;
for(String s : supported) {
    if(url.startsWith(s)) {
       isSupported = true;
       break;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者这是检查for循环中条件的最短形式?

Aze*_*zel 12

如果您使用的是Java 8,可以在Stream API的帮助下在一行中完成:

boolean isSupported = supported.stream().anyMatch(s -> url.startsWith(s));
Run Code Online (Sandbox Code Playgroud)

  • 这是另一个版本:`supported.stream().anyMatch(url :: startsWith);` (5认同)

Tim*_*sen 6

@Azel +1给出的Java 8答案很精简,可能是您当前设计的最佳答案.但是,我不得不在过去你类似的问题,并发现它更好地利用他们的主人利用任意开始串识别的网址,而不是只.我最终做的是创建一个主机地图.然后,我将每个传入的URL Map与之比较,如下所示:

Map<String, Integer> hosts = new HashMap<>();
hosts.add("google.com", 1);
hosts.add("stackoverflow.com", 1);
hosts.add("wordpress.com", 1);

URL url = new URL("http://www.google.com");
String host = url.getHost();

if (hosts.containsKey(host)) {
    System.out.println("Found " + url + " in list of approved hosts.");
}
Run Code Online (Sandbox Code Playgroud)

这里的基本思想是我们甚至不需要迭代已批准的域列表,我们可以只针对白名单(或者黑名单)进行持续时间查找.

实际上,您可以使用Java属性文件来存储已知主机的列表,然后在需要时加载它.

  • 这值得为`url.getHost()`做一个upvote.如果您可能遇到像http:// google.computers.are.evil /`这样的网址,那么它比使用`startsWith`更好. (2认同)