字符串数组转换为List在我们开发中是一个很常见的操作,我们可能从SharedPreferences读出数据需要转换成list,很多时候可能是这样写的:
public List<String> getHistory() {
String historyStr = sharedPreferences.getString("history", null);
if (historyStr == null) {
return null;
} else {
String[] historyArray = historyStr.split(",");
ArrayList<String> list = new ArrayList<>();
for (String s : historyArray) {
list.add(s);
}
return list;
}
}
这样写也没什么问题,只是会有个warning,Iteration can be replaced with bulk 'Collection.addAll' call,这是告诉你,其实有更简洁的现成方法Collections.addAll(),于是可以改成这样:
public List<String> getHistory() {
String historyStr = sharedPreferences.getString("history", null);
if (historyStr == null) {
return null;
} else {
String[] historyArray = historyStr.split(",");
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, historyArray);
return list;
}
}
看一下Collections.addAll()这个方法的源码:
@SafeVarargs
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
其实实现跟刚才是一样的,一个for循环逐项添加
如果你直接使用了
String[] historyArray = historyStr.split(",");
return Arrays.asList(historyArray);
这样返回的List只能读,不能添加元素,因为返回的是一个List接口类,是抽象的