将枚举值转换为逗号分隔字符串的最有效方法



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

我将这个枚举的值转换为逗号分离字符串的方式是最有效的方法吗?如果是这样,删除字符串最后一个字符处多余的逗号的最有效方法是什么?

例如,我的方法返回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();
}
}
}

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

我会这样做:

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

如果你愿意,可以缓存它;但这可能不会产生巨大的差异。

我看到的尾随逗号问题的常见模式是这样的

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

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

最有效的代码是不运行的代码。这个答案永远不会改变,所以在创建枚举时,请像运行一次一样运行该代码。接受一次打击,每隔一段时间有人要求返回计算出的答案。从长远来看,这样做的节省会比担心如何具体构造字符串要大得多,所以使用你最清楚的东西(编写代码供人类阅读(。

例如:

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

如果你必须在短时间内调用这个静态方法千千万次,你可能会担心性能,你应该首先检查这是否有性能成本。
JVM 在运行时执行许多优化。
因此,最后您可以编写更复杂的代码而不会增加价值。


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

可以使用对静态字符串字段进行值值的静态初始值设定项。
关于,字符,只需在循环后将其删除即可。

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

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

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();一样使用它

最新更新