Java的隐藏功能 - ArrayList / instance初始化程序说明

时间:2011-05-26 18:35:06

标签: java arraylist initialization

Hidden Features of Java问题中,我对the answer about instance initializers感兴趣。

我想知道如何修改这一行:

List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};

为了使它与嵌套的Arraylists执行相同的工作:

ArrayList<ArrayList<Integer>> numbers = ...

可能吗?

5 个答案:

答案 0 :(得分:4)

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, 2), asList(2,3,4));

答案 1 :(得分:3)

对于列表而言,双括号初始化没有那么有趣,因为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,所有人都支持文字列表语法。

答案 2 :(得分:2)

当然,你可以为内部ArrayLists做同样的事情,虽然我认为它变得非常难以理解......

    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)方法似乎是最好的。

答案 3 :(得分:2)

我不会用这个成语来“简化”ArrayList声明。它看起来很酷,但它不必要地创建了一个ArrayList的匿名子类,它看起来太“神奇”了我的口味......你想要下一个开发人员可读和可理解的代码。

您应该考虑使用Google Guava等库。

以下是使用Guava的Lists.newArrayList(E... elements)实用程序方法的示例:

    import com.google.common.collect.Lists;


    List<ArrayList<Integer>> numbers = Lists.newArrayList(
            Lists.newArrayList(1, 2),
            Lists.newArrayList(3, 4)
    );

或者更好的是,只使用左侧的List接口(您应该避免在变量声明中使用具体类):

    import com.google.common.collect.Lists;


    List<List<Integer>> numbers = Lists.<List<Integer>>newArrayList(
            Lists.newArrayList(1, 2),
            Lists.newArrayList(3, 4)
    );

如果你知道这些列表是不可变的,那么使用ImmutableList会更好:

    import com.google.common.collect.ImmutableList;


    List<List<Integer>> numbers = ImmutableList.<List<Integer>>of(
            ImmutableList.of(1, 2),
            ImmutableList.of(3, 4)
    );

答案 4 :(得分:1)

只需将int替换为ArrayList<integer>

的对象即可
List<ArrayList<Integer>> numbers = new ArrayList<ArrayList<Integer>>() {

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