开关中的计算案例陈述(java)

问题描述 投票:2回答:3

我一直在问自己这个问题已有一段时间了,这是一个基本的问题,但是我从来没有其他方法可以做到这一点

目标消除代码中的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

我举了一个例子,但问题是案件陈述需要计算

java optimization switch-statement
3个回答
1
投票

目标消除代码中的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个,另一个在后面

有什么问题?

  • 如果具有可读性,请确保除了内部的一个简单方法调用外,您什么也不做。或使用我的方法。
  • 如果是速度,那么请确保处理通常花费更多数量级的时间。由于字符串是事先已知的,因此您可以使用一些智能算法进行优化,但这很可能浪费时间。

1
投票

对于初学者,我会使用:

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;
}

1
投票

可以创建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)
    }
© www.soinside.com 2019 - 2024. All rights reserved.