将Enum值转换为逗号分隔String的最有效方法

时间:2017-08-10 19:19:13

标签: java string enums

我有一个java类,我在其中存储一个Enum。(显示在这个问题的底部)在这个枚举中,我有一个名为 toCommaSeperatedString()的方法,它返回逗号分隔的String枚举值。在阅读了这个问题here中有关性能的一些信息之后,我正在使用StringBuilder。

我将这个枚举值转换为commaSeperatedString的方式是这样做的最有效方法,如果是这样,那么在String的最后一个字符处删除额外逗号的最有效方法是什么?

例如,我的方法会返回123, 456,,但我更喜欢123, 456。如果我想返回PROPERTY1, PROPERTY2我可以轻松使用Apache Commons库StringUtils.join(),但是,当我迭代String数组时,我需要通过调用getValue方法来降低一级。

public class TypeEnum {
    public enum validTypes {
        PROPERTY1("123"),
        PROPERTY2("456");

        private String value;

        validTypes(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

        public static boolean contains(String type) {
            for (validTypes msgType : validTypes.values()) {
                if (msgType.value.equals(type)) {
                    return true;
                }
            }
            return false;
        }

        public static String toCommaSeperatedString() {
            StringBuilder commaSeperatedValidMsgTypes = new StringBuilder();
            for(validTypes msgType : validTypes.values()) {
                commaSeperatedValidMsgTypes.append(msgType.getValue() + ", ");
            }
            return commaSeperatedValidMsgTypes.toString();
        }
    }
}

5 个答案:

答案 0 :(得分:10)

我不会担心效率问题。如果您不以疯狂的方式做到这一点,那么这样做很简单就会很快。如果这是您的代码中最重要的性能瓶颈,我会感到惊讶。

我做这样的事情:

return Arrays.stream(TypeEnum.values())
      .map(t -> t.value)
      .collect(Collectors.joining(','));

如果你想要缓存它;但这可能不会产生巨大的影响。

答案 1 :(得分:2)

最有效的代码是不运行的代码。这个答案永远不会改变,因此在创建枚举时,只需运行一次代码即可。点击一次,每隔一次有人要求返回计算出的答案。从长远来看,这样做可以节省更多,而不用担心如何专门构造字符串,所以使用 clearest 的任何内容(为人类编写代码来阅读)。

例如:

public enum ValidTypes {

    PROPERTY1("123"),
    PROPERTY2("345");

    private final static String asString = calculateString();
    private final String value;

    private static String calculateString() {
        return // Do your work here.
    }

    ValidTypes(final String value) {
        this.value = value;
    }

    public static String toCommaSeparatedString() {
        return asString;
    }
}

答案 2 :(得分:2)

如果您必须在短时间内将这种静态方法称为千次和数千次,您可能会担心性能问题,首先应检查这是否具有性能成本。
JVM在运行时执行许多优化 所以最后你可以编写更复杂的代码而不增加价值。

无论如何,您应该做的实际事情是存储String返回的toCommaSeperatedString并返回相同的实例。
枚举是常数值。所以缓存它们不是问题。

您可以使用静态初始值设定项来估算静态字符串字段 关于,字符,只需在循环后将其删除即可。

public enum validTypes {

PROPERTY1("123"), PROPERTY2("456");

private static String valueSeparatedByComma;

static {
    StringBuilder commaSeperatedValidMsgTypes = new StringBuilder();
    for (validTypes msgType : validTypes.values()) {
        commaSeperatedValidMsgTypes.append(msgType.getValue());
        commaSeperatedValidMsgTypes.append(",");
    }

    commaSeperatedValidMsgTypes.deleteCharAt
    (commaSeperatedValidMsgTypes.length()-1);
    valueSeparatedByComma = commaSeperatedValidMsgTypes.toString();
}

public static String getvalueSeparatedByComma() {
    return valueSeparatedByComma;
}

答案 3 :(得分:2)

我看到的尾随逗号问题的常见模式类似于

String[] values = {"A", "B", "C"};
boolean is_first = true;
StringBuilder commaSeperatedValidMsgTypes = new StringBuilder();
for(String value : values){
    if(is_first){
        is_first = false;
    }
    else{
        commaSeperatedValidMsgTypes.append(',');
    }
    commaSeperatedValidMsgTypes.append(value);
}
System.out.println(commaSeperatedValidMsgTypes.toString());

导致

A,B,C

将此与使用静态块初始化静态最终字段的答案相结合可能会提供最佳性能。

答案 4 :(得分:0)

我通常在枚举类本身上添加一个静态方法:

public enum Animal {
    CAT, DOG, LION;

    public static String possibleValues() {
        return Arrays.stream(Animal.values())
                .map(Enum::toString)
                .collect(Collectors.joining(","));
    }
}

所以我可以像String possibleValues = Animal.possibleValues();

那样使用它