当前位置: 首页 > 面试题库 >

避免在Java中使用多个If语句

东郭海阳
2023-03-14
问题内容

我已经编写了类似这样的方法。但是我猜这应该进行重构。谁能建议最好的方法来避免使用多个if语句?

private String getMimeType(String fileName){
  if(fileName == null) {
    return "";   
  } 
  if(fileName.endsWith(".pdf")) {
    return "application/pdf";   
  }
  if(fileName.endsWith(".doc")) {
    return "application/msword";  
  }
  if(fileName.endsWith(".xls")) {
    return "application/vnd.ms-excel"; 
  }
  if(fileName.endsWith(".xlw")) {
    return "application/vnd.ms-excel"; 
  }
  if(fileName.endsWith(".ppt")) {
    return "application/vnd.ms-powerpoint"; 
  }
  if(fileName.endsWith(".mdb")) {
    return "application/x-msaccess"; 
  }
  if(fileName.endsWith(".rtf")) {
    return "application/rtf"; 
  }
  if(fileName.endsWith(".txt")) {
    return "txt/plain"; 
  }
  if(fileName.endsWith(".htm") || fileName.endsWith(".html")) {
    return "txt/html"; 
  }
  return "txt/plain"; 
}

我在这里不能使用大小写转换,因为我的“条件”是java.lang.String


问题答案:

您可以使用Map来保存您的解决方案:

Map<String,String> extensionToMimeType = new HashMap<String,String>();
extensionToMimeType.put("pdf", "application/pdf");
extensionToMimeType.put("doc", "application/msword");
// and the rest

int lastDot = fileName.lastIndexOf(".");
String mimeType;
if (lastDot == -1) {
    mimeType = NO_EXTENSION_MIME_TYPE;
} else {
    String extension = fileName.substring(lastDot+1);
    mimeType = extensionToMimeType.getOrDefault(extension, 
                                                UNKNOWN_EXTENSION_MIME_TYPE);
}

为了使此代码起作用,您需要像在类中那样进行定义NO_EXTENSION_MIME_TYPE和定义UNKNOWN_EXTENSION_MIME_TYPE,如下所示:

private static final String NO_EXTENSION_MIME_TYPE = "application/octet-stream";
private static final String UNKNOWN_EXTENSION_MIME_TYPE = "text/plain";


 类似资料:
  • 问题内容: 我正在尝试编写一个Java程序,该程序根据用户选择的内容初始化某些布局。我想做的是尝试避免编写一堆if语句,以便在需要添加更多布局的情况下可以对代码进行伸缩以供将来使用。我听说实现此目标的最佳方法是使用多态性,但是我对多态性的理解仍然有些模糊。 说我要实现这种情况: 我当时在考虑为类的实现创建一个接口。令我困惑的是它在main()中是如何工作的,我是否仍然不需要条件if或switch语

  • 你们可能都遇到过以下场景: } 简而言之,如何在Objective-C的氛围中有效地简化上述场景? 有什么建议/想法/解决方案吗?干杯:) 编辑:供参考,从这里拍摄的场景。我希望这个问题可以节省哪怕一秒钟需要的开发人员。

  • 问题内容: 我有以下(也许是常见的)问题,此刻绝对使我感到困惑: 有几个生成的事件对象扩展了抽象类,我想将它们划分为Session Bean,例如 但是将来可能会有两种以上的事件类型,因此if- else将会很长,甚至可能无法读取。另外,在这种情况下,我认为这并不是真正的“最佳实践”。 我可以在类型中添加一个抽象方法,并让它们自行划分,但随后我必须在每个实体中注入特定的Session Bean。

  • 问题内容: 具有“ instanceof”操作链被认为是“代码异味”。标准答案是“使用多态性”。在这种情况下我该怎么办? 基类有许多子类。他们都不在我的控制之下。类似的情况是Java类Integer,Double,BigDecimal等。 我确实可以控制等。 我不想使用几行代码就能完成的代码。(有时,我制作了一个HashMap将映射到的实例,将映射到的实例,等等。但是今天我想要一些更简单的方法。)

  • 问题内容: 我只是想知道下面的if语句是否有效: 我的目标是确保同时满足以下2个要求:1. value [6]必须位于目标2.目标中的value [0]或value [1]如果我做了一个不好的例子,请道歉我的问题是,是否可以在一个语句中进行三个AND&OR?非常感谢! 问题答案: 使用 括号 将条件分组: 请注意,如果将定义为一组,则可以在固定时间内进行查找: 并且,正如@Pramod在评论中提到