为了账号安全,请及时绑定邮箱和手机立即绑定

将枚举的 ArrayList 转换为字符串

将枚举的 ArrayList 转换为字符串

偶然的你 2021-11-24 15:15:20
我有以下enums,可以填充一个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>参数调用的,不能用参数调用(这是我的类的类型)。我也无法创建一个 type 的类Enum。由于enum!= Enum,我如何使arrayListToString方法与我的enum类一起工作?
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

由于 anenum X隐式是 的子类Enum<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(", "));

}


查看完整回答
反对 回复 2021-11-24
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

更改签名arrayListToString()从此:

public static String arrayListToString(ArrayList<Enum> arrayList)

对此:

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

在该剧的核心理念是,List<Integer>不是一个List<Number>,即使一个Integer是一个Number。这是有道理的,因为您可以将 aDouble放入 aList<Number>但不能将 aDouble放入 a List<Integer>

同样,aList<RewardType>不是 a List<Enum>,即使 aRewardTypeEnum

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


查看完整回答
反对 回复 2021-11-24
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

正如 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();

}


查看完整回答
反对 回复 2021-11-24
  • 3 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信