Java的隐藏功能-ArrayList /实例初始化器的说明

问题描述

|| 在Java的隐藏功能问题中,我对有关实例初始化程序的答案很感兴趣。 我想知道如何修改此行:
List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};
为了使它执行与嵌套Arraylists相同的工作:
ArrayList<ArrayList<Integer>> numbers = ...
那可能吗?     

解决方法

List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};
我真的不推荐这种方法,因为它没有充分的理由创建一个(匿名)类。 使用以下任一方法:
List<Integer> numbers = Arrays.asList(1,2);
要么
List<Integer> numbers = new ArrayList<Integer>(Arrays.asList(1,2));
对于2个级别,您可以使用:
List<List<Integer>> numbers = Arrays.asList(Arrays.asList(1,2),Arrays.asList(2,3,4));
如果您确实想执行静态导入,甚至可以将其简化为:
List<List<Integer>> numbers = asList(asList(1,asList(2,4));
    ,现在,由于Arrays.asList使用varargs,双括号初始化对列表的吸引力降低了,您可以改为执行以下操作:
List<List<Integer>> numbers = new ArrayList<List<Integer>>();
numbers.add(Arrays.asList(1,2));
numbers.add(Arrays.asList(3,4));
或结合双括号初始化,如下所示:
List<List<Integer>> numbers = new ArrayList<List<Integer>>() {{add(Arrays.asList(1,2)); add(Arrays.asList(3,4));}};
但是它是否适合一行取决于项目的代码格式准则。这是如此的冗长,以至于替代方案开始看起来不错。就像将数字放入字符串并进行解析一样。或者切换到Scala,Groovy或Clojure,它们都支持文字列表语法。     ,当然,您也可以对内部ArrayList执行相同的操作:尽管我认为它变得非常难以理解...
    List<ArrayList<Integer>> numbers = new ArrayList<ArrayList<Integer>>()
    {
        {
            add(new ArrayList<Integer>()
            {
                {
                    add(1);
                    add(2);
                }
            });
            add(new ArrayList<Integer>()
            {
                {
                    add(1);
                    add(2);
                }
            });
        }
    };
虽然不会比传统方式更长或更糟(取决于支撑方式!)
    List<ArrayList<Integer>> numbers = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> list1 = new ArrayList<Integer>();
    ArrayList<Integer> list2 = new ArrayList<Integer>();
    list1.add(1);
    list1.add(2);
    list2.add(1);
    list2.add(2);
    numbers.add(list1);
    numbers.add(list2);
在其他答案中给出的Arrays.asList(1,2)方法似乎是最好的。     ,我不会用这个惯用法来“简化”
ArrayList
声明。它看起来很酷,但是它不必要地创建了一个
ArrayList
匿名子类,并且按照我的喜好看起来也很“神奇”……您希望下一个开发人员可以读取和理解的代码。 您应该考虑使用诸如Google Guava之类的库。 这是一个使用Guava \'s Lists.newArrayList(E ... elements)实用程序方法的示例:
    import com.google.common.collect.Lists;


    List<ArrayList<Integer>> numbers = Lists.newArrayList(
            Lists.newArrayList(1,Lists.newArrayList(3,4)
    );
或者,甚至更好的是,仅使用左侧的
List
接口(应避免在变量声明中使用具体的类):
    import com.google.common.collect.Lists;


    List<List<Integer>> numbers = Lists.<List<Integer>>newArrayList(
            Lists.newArrayList(1,4)
    );
如果您知道这些列表将是不可变的,则最好使用ImmutableList:
    import com.google.common.collect.ImmutableList;


    List<List<Integer>> numbers = ImmutableList.<List<Integer>>of(
            ImmutableList.of(1,ImmutableList.of(3,4)
    );
    ,只需将
int
替换为
ArrayList<integer>
的对象
List<ArrayList<Integer>> numbers = new ArrayList<ArrayList<Integer>>() {

            {
                add(new ArrayList<Integer>());
                add(new ArrayList<Integer>());
            }
        };