问题描述
||
在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>());
}
};