[英]Converting ArrayList<ArrayList<String>> to ArrayList<ArrayList<Integer>>
[英]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)
作用的核心概念是,即使Integer
是Number
, List<Integer>
也不是List<Number>
。 这是有道理的,因为您可以将Double
放入List<Number>
但不能将Double
放入List<Integer>
。
类似地,即使RewardType
是Enum
, List<RewardType>
也不是List<Enum>
。
List<RewardType>
是 List<? extends Enum>
List<? extends Enum>
。 这是因为我们现在所说的列表是某种枚举的列表,而不是任何枚举的列表。
由于enum 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(", "));
}
正如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.