关于List使用过程中遇到的一些问题

148 阅读1分钟

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)