使用string.equals方法简化if语句

5
有没有办法缩短这个if()语句?以避免重复使用string.equals()
if (extension.equals("jpg") || extension.equals("JPG") || extension.equals("png") || extension.equals("PNG") || extension.equals("bmp") || extension.equals("BMP") || extension.equals("jpeg") || extension.equals("JPEG"))
{
    tmp.setIcon(new ImageIcon(getClass().getResource("/menage/Resources/imageIco.png")));
}

转化为类似以下的内容:

转化后的样式如下:

if (extension.equals(("jpg")||("JPG")||("png")||("PNG")||("bmp")||("BMP")||("jpeg")||("JPEG")))
{
    tmp.setIcon(new ImageIcon(getClass().getResource("/menage/Resources/imageIco.png"));)
}

我知道这个问题看起来很奇怪,但是使用如此长的条件列表的if()语句并不清晰,而且需要大量的编写。


你可以尝试将不同的选项打包到一个List中,并通过List#contains进行检查。switch语句也可能会缩短代码。 - Dragondraikk
你可以使用switch代替。 - Ashwani
你正在使用Java 8吗? - Captain Man
8个回答

5

首先,将equals(...)替换为equalsIgnoreCase(...)

另外一种选择是创建一个小写字符串(如果需要也可以是大写)的 HashSet,其中包含您的图像扩展名,并检查它是否包含您感兴趣的字符串,将其更改为小写:

if (imageExtSet.contains(myExtension.toLowerCase()) {

}

你可以使用一个常量集合。public static final List<String> VALID_IMAGE_EXTENSIONS = Arrays.asList("JPG", "GIF", "PNG"); - Matt
1
@Matt Set<String> 的性能比List<String>更好。对于这些情况,这是正确的选择。不幸的是,似乎人们更喜欢天真地使用List或数组来完成工作 =. - Luiggi Mendoza

4

这是一个带有预定义图像类型的简短版本:

Set<String> imgTypes = new HashSet<>() {{ 
  add("jpg");   add("JPG");
  add("png");   add("PNG");
  add("bmp");   add("BMP");
  add("jpeg");  add("JPEG");
}};

public boolean isImgType(String type) {
  return imgTypes.contains(type);
}

3

你可以将所有值存储在列表中,然后查询是否包含。如果仅为一行代码(不需要在其他地方询问此条件),则可以执行以下操作:

if (Arrays.asList("jpg", "JPG", "png", "PNG", "bmp", "BMP", "jpeg", "JPEG").contains(extension))

当然,您可以将该列表保存为对象,然后在需要引用此条件的任何地方使用它。

虽然这样可以运行,但最好使用Set来加速它(但是谁会计算几毫秒呢?)。 - Luiggi Mendoza
1
你应该使用 extension.toLowerCase() 并维护一个所有小写值的列表,这样你就不必重复所有可能的大小写形式。 - yurib

2

使用 HashSet 如下所示

Set<String> extSet= new HashSet<String>();
// Add All in Lower case .. to save your efforts

extSet.add("jpg");
extSet.add("png");

//...etc etc

只需检查它是否存在于集合中即可。

if(extSet.contains(extension==null?null:extension.toLowerCase()))
{
/// True
}
else
{
// False
}

1
检查扩展名是否为空是个好习惯!你可以这样创建一个集合:final Set<String> ext = new HashSet<>(Arrays.asList("png", "jpg"));。你可以使用以下代码进行检查:if (extension != null && extSet.contains(extension.toLowerCase())),但这与你的代码几乎相同。 - Freek de Bruijn

0

你可以做的一件事情是将字符串转换为小写,以消除一些检查:

String ext = extension.toLowerCase();

现在你已经将语句简化为:
if (ext.equals("jpg") || ext.equals("png") || ext.equals("bmp") || ext.equals("jpeg"))

如果extnull,这会出现严重的错误。 - Luiggi Mendoza
好的,我知道了。下次你的代码出问题时,我知道你会说“那不是要求的,所以我没有做” :) - Luiggi Mendoza
1
很简单就可以解决: "jpg".equals(ext)。 - David George
这是一种经典但非常有用的防御技术。 - David George

0
if (Arrays.asList("jpg", "jpeg", "png", "bmp").contains(extension.toLowerCase))

0

添加一些方法...

private static boolean isJpeg(String ext) {
    return java.util.Arrays.asList("jpg", "jpeg").contains(ext.toLowerCase());
}

private static boolean isPng(String ext) {
    return "png".equalsIgnoreCase(ext);
}

private static boolean isBmp(String ext) {
    return "bmp".equalsIgnoreCase(ext);
}

并将其更改为...

else if (isJpeg(extension) || isPng(extension) || isBmp(extension))
            {
                tmp.setIcon(new ImageIcon(getClass().getResource("/menage/Resources/imageIco.png")));
            }

isJpeg 如果扩展名为 null,将会抛出 NullPointerException 异常,因此请确保添加 extension != null || ... 或其他内容来避免该情况。


以上对于您的特定情况略有不同,因为它允许“JpEg”和所有其他混合大小写通过。如果您不想要那样,请使用以下内容。此外,以下内容的额外好处是,如果扩展名为“null”,它们永远不会抛出NullPointerException异常。
private static boolean isJpeg(String ext) {
    return java.util.Arrays.asList("jpg", "JPG", "jpeg", "JPEG").contains(ext);
}

private static boolean isPng(String ext) {
    return java.util.Arrays.asList("png", "PNG").contains(ext);
}

private static boolean isBmp(String ext) {
    return java.util.Arrays.asList("bmp", "BMP").contains(ext);
}

0

其他答案给出了许多好的底层思路,但这里的基本原则是防止代码重用。

如果您需要进行此测试超过一次,请创建一个方法以替代执行测试:

boolean isValidImageExtenstion(String extension) {
    return (extension.equals("jpg") || extension.equals("JPG") ||
            extension.equals("png") || extension.equals("PNG") ||
            extension.equals("bmp") || extension.equals("BMP") ||
            extension.equals("jpeg") || extension.equals("JPEG"));
}

每当需要时调用该方法。如果你喜欢,可以在方法内使用其他答案中描述的方法之一("ignore case" 的建议肯定值得采纳),但其余部分现在变得不那么重要了,因为你已经避免了代码重复。作为奖励,如果你决定要支持 gif 扩展名,那么只需要在一个地方进行更改。

这种方法相较于其他方法的优点是它是自我说明的。方法的作用非常明显,而其他答案则有些晦涩难懂。

如果你只是做一次,并且不打算再做一次,那么你已经创建出可行的代码,所以不要浪费时间修改可行的代码


我认为对于使代码更易读而进行重构是值得的。虽然OP提供的特定示例可能已经足够好,但“if”语句很快就会变得难以阅读。如果代码易于阅读,下一个人来到时检查会更容易。 - Captain Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接