如何简便比较两个URI的scheme:host:port部分(基础URI)是否相等?
如何简便比较两个URI的scheme:host:port部分?
当然有更简洁的方式,不用像你那样手动逐个判断scheme、host和port!Java的URI类本身就提供了可靠的相等性判断逻辑,我们可以利用这一点来简化代码。
方法一:构造基础URI直接对比
核心思路是把需要对比的URI转换成只保留scheme、host、port的"基础URI",然后直接调用equals()方法比较即可,URI的equals会帮我们正确处理这几个部分的匹配逻辑(包括大小写、默认端口等细节)。
示例代码:
URI firstURI = new URI("https://localhost:8000"); URI secondURI = new URI("https://localhost:8000/testing"); // 提取第二个URI的基础部分(仅保留scheme、host、port) URI secondBaseURI = new URI( secondURI.getScheme(), null, // userInfo secondURI.getHost(), secondURI.getPort(), null, // path null, // query null // fragment ); // 直接对比两个基础URI if (!firstURI.equals(secondBaseURI)) { // 处理不匹配的情况 }
方法二:利用resolve简化路径处理
如果你的第一个URI本身就是不带路径的基础URI(比如https://localhost:8000),还可以通过resolve("/")把第二个URI的路径重置为根路径,再对比:
URI firstURI = new URI("https://localhost:8000"); URI secondURI = new URI("https://localhost:8000/testing"); // 注意:如果firstURI末尾没有斜杠,而resolve得到的URI有斜杠,equals会返回false // 可以统一给firstURI加上斜杠,或者用normalize处理 URI secondRootURI = secondURI.resolve("/").normalize(); URI firstRootURI = firstURI.resolve("/").normalize(); if (!firstRootURI.equals(secondRootURI)) { // 处理不匹配的情况 }
为什么比手动判断好?
- 更简洁:不用写一堆
||和&&的判断逻辑 - 更可靠:
URI的equals方法已经考虑了很多细节,比如host的大小写不敏感、默认端口的处理(比如http的80端口如果省略,和显式写80会被认为相等),手动判断很容易漏掉这些场景。
内容的提问来源于stack exchange,提问作者user6800688
相关产品推荐
相关产品推荐

