我一直在问自己这个问题已有一段时间了,这是一个基本的问题,但是我从来没有其他方法可以做到这一点
目标消除代码中的else if
我实际上有这个:
String contentType = parser.getMimeMessage().getContentType().toLowerCase();
//contentType can be for example: "text/a; charset=us-ascii"
String content = parser.getPlainContent();
if (contentType.indexOf("text/a") > 0) {
processTextA(content);
} else if (contentType.indexOf("text/b") > 0) {
processTextB(content);
} else if (contentType.indexOf("text/c") > 0) {
processTextC(content);
}
我想做的是类似的事情:
String contentType = parser.getMimeMessage().getContentType().toLowerCase();
//contentType can be for example: "text/a; charset=us-ascii"
String content = parser.getPlainContent();
switch (contentType) {
case (contentType.indexOf("text/a") > 0):
processTextA(content);
break;
case (contentType.indexOf("text/b") > 0):
processTextB(content);
break;
case (contentType.indexOf("text/c") > 0):
processTextC(content);
break;
}
有什么办法可以实现类似的目的?
在示例中,我放了3 else if
,但现实是我有20 else if
一个在另一个后面
编辑
contentType可以是text/a; charset=us-ascii
,但是也可以是charset=us-ascii; text/a;
我不相信发送方符合任何规范,因为它是公司之间的专用通信协议,所以无法使用split
我举了一个例子,但问题是案件陈述需要计算
目标消除代码中的
else if
如果您保持简单,其他没有什么错。但是您在这里:
@RequiredArgsConstructor // https://projectlombok.org/api/lombok/RequiredArgsConstructor.html
enum MyContentType {
NONE(""),
A("text/a"),
B("text/a"),
C("text/a"),
;
static MyContentType from(String contentTypeHeader) {
final String header = contentTypeHeader.toLowerCase();
return Arrays.stream(MyContentType.values())
.skip(1)
.filter(e -> header.contains(e.headerSubstring))
.findFirst().orElse(NONE);
}
private final String headerSubstring;
}
然后打开MyContentType
成员。
在示例中,如果不是,我将别的数字设为3,但是实际情况是我有20
else if
个,另一个在后面
有什么问题?
对于初学者,我会使用:
contentType.contains("text/a")
而不是:
contentType.indexOf("text/a") > 0
[如果我理解正确,则您的contentType
中只能有一个MimeMessage
(根据您使用else if
而不是if
的事实推论得出)。您可以简单地将contentType
除以;
,以获得所需的字符串部分。然后,您可以在字符串上切换大小写。像这样的东西:
String contentType = parser.getMimeMessage().getContentType().toLowerCase();
//contentType can be for example: "text/a; charset=us-ascii"
String content = parser.getPlainContent();
String contentTypeSplitted = contentType.split(";")[0];
switch (contentTypeSplitted) {
case ("text/a"):
processTextA(content);
break;
case ("text/b"):
processTextB(content);
break;
case ("text/c"):
processTextC(content);
break;
}
可以创建textType的映射->操作。例如:
static Map<String, Consumer<String>> operationMap = new HashMap<>();
static {
operationMap.put("text/a", this::processTextA);
operationMap.put("text/b", this::processTextC);
}
public static void process(String contentType, String content) {
operationMap.get(content).accept(content)
}