繁体   English   中英

将枚举的ArrayList转换为String

[英]Converting ArrayList of enums to String

我有以下enum ,它可以填充ArrayList

public enum RewardType {
    POINTS, MONEY, TOKENS, RANDOM;
}

public enum OfferType {
    GIFT, DISCOUNT, LOTTERY;
}

要将ArrayList转换为String ,请使用以下方法:

public static String arrayListToString(ArrayList<Enum> arrayList) {
    String finalString = "";
    for (int i = 0; i < arrayList.size(); i++) {
        if (TextUtils.isEmpty(finalString)) {
            finalString = arrayList.get(i).name();
        } else {
            finalString = finalString + ", " + arrayList.get(i).name();
        }
    }
    return finalString;
}

然后我这样称呼它:

String rewardType = arrayListToString(mainModel.getRewardTypes()); 
//getRewardTypes returns an ArrayList<RewardType>

问题是, arrayListToString是使用ArrayList<Enum>调用的,而不能使用ArrayList<enum>参数(这是我的类的类型)来调用的。 我也无法创建类型为Enum的类。 由于enum != Enum ,如何使arrayListToString方法与我的enum类一起使用?

arrayListToString()更改arrayListToString()的签名:

 public static String arrayListToString(ArrayList<Enum> arrayList) 

对此:

public static String arrayListToString(ArrayList<? extends Enum> arrayList)

作用的核心概念是,即使IntegerNumberList<Integer> 也不List<Number> 这是有道理的,因为您可以将Double放入List<Number>但不能将Double放入List<Integer>

类似地,即使RewardTypeEnumList<RewardType>也不是List<Enum>

List<RewardType> List<? extends Enum> List<? extends Enum> 这是因为我们现在所说的列表是某种枚举的列表,而不是任何枚举的列表。

由于enum XEnum<X>的子类,因此将方法声明更改为:

public static String arrayListToString(ArrayList<? extends Enum> arrayList)

但是,为什么呢?

枚举的toString()默认情况下会返回name() ,因此您无需调用name() ,这意味着您不再关心列表中的内容,因此此更有用的方法将起作用太:

public static String listToString(List<?> list) {
    StringBuilder buf = new StringBuilder();
    boolean first = true;
    for (Object value : list) {
        if (first)
            first = false;
        else
            buf.append(", ");
        buf.append(value);
    }
    return buf.toString();
}

甚至比这更简单:

public static String toString(Iterable<?> iterable) {
    StringJoiner joiner = new StringJoiner(", ");
    for (Object value : iterable)
        joiner.add(String.valueOf(value));
    return joiner.toString();
}

或使用Java 8+流:

public static String toString(Collection<?> coll) {
    return coll.stream().map(Object::toString).collect(Collectors.joining(", "));
}

正如Ben所提到的,您应该使用类型泛型来正确评估类型。

除此之外,您的方法还没有优化。 考虑使用StringBuilder防止创建垃圾String对象,并在循环内删除多余的isEmpty检查:

public static <T extends Enum<?>> String enumListToString(List<T> list){
    if(list.size() < 1)
        return "";
    StringBuilder sb = new StringBuilder();
    sb.append(list.get(0).name());
    for (int i = 1; i < list.size(); i++) {
        sb.append(", ").append(list.get(i));
    }
    return sb.toString();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM