1. Arrays.asList 返回的是Arrays的内部类ArrayList
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.remove(1); // 执行该语句的时候报错,具体报错见下方
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161)
错误原因
Arrays.asList 返回的是Arrays的内部类ArrayList,这个内部类ArrayList没有重写remove方法。
切记:
List list = new ArrayList<>();
与
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
返回的是Arrays的内部类ArrayList与此处的ArrayList并不是同一个类。
2. 升级jdk8之后,可以使用forEach遍历List
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 方式一
list.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
// 方式二:lambda
list.forEach((item) ->{
System.out.println(item);
});
// 方式三:是方式二的简化
list.forEach(System.out::println);
个人感觉比for增强好用一些,但是使用过程中可能会遇到这个错误
Variable used in lambda expression should be final or effectively final
这个错误的原因是外部变量无法在lambda表达式内部赋值,如果需要从lambda表达式中获取值,可以使用List或者数组。
例如:使用List
Map<String, Object> map = new HashMap<>();
map.put("key2019","value2019");
List<String> strList = new ArrayList<>();
map.forEach((key, value) ->{
String str = String.valueOf(value);
System.out.println("key:" + key);
System.out.println("value:" + value);
strList.add(String.valueOf(value));
});
strList.forEach(System.out::println)