在Hidden Features of Java问题中,我对the answer about instance initializers感兴趣。
我想知道如何修改这一行:
List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};
为了使它与嵌套的Arraylists执行相同的工作:
ArrayList<ArrayList<Integer>> numbers = ...
可能吗?
答案 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>());
}
};