我已经问自己这个问题有一段时间了,这是一个基本问题,但我从来没有能够以任何其他方式做到这一点
目标是消除代码中的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;文本/a;
我不能相信发件人满足任何规范,因为它是公司之间的私有(private)通信协议(protocol),因此无法使用split
我举了这个例子,但问题是case语句需要计算
最佳答案
The goal is to eliminate
else if
in code
只要保持简单,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
成员。
In the example I put 3 else if but the reality is that I have about 20
else if
one behind the other
担心什么?
- 如果具有可读性,请确保除了内部的一个简单方法调用之外,您不执行任何操作。或者使用我的方法。
- 如果速度快,那么请放心,处理过程通常会花费多个数量级的时间。由于字符串是预先知道的,您可以使用一些智能算法进行优化,但这很可能是浪费时间。
关于java - switch 中计算的 case 语句 (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61457746/