繁体   English   中英

用双花括号初始化连接列表

[英]Concatenate lists with double brace initialization

我想串联两个数组列表,如答案所示

final List<String> l1 = Lists.newArrayList(...);
final List<String> l2 = Lists.newArrayList(...);
List<String> l = new ArrayList<String>() { { addAll(l1); addAll(l2); } };

有没有非风格的原因,我不应该以这种方式使用它?

如果您已经在使用番石榴,则可以使用以下一种衬垫进行:

List<String> l = FluentIterable.from(l1).append(l2).copyInto(new ArrayList<String>());

我个人不喜欢大括号。 这产生新的类只是为了以不同的方式对其进行初始化。 新类意味着更大的目标jar文件,JVM需要更多的内存来存储类,更大的JIT编译器继承表等。如果您在任何地方都使用这种方法,这将变得很重要。 如果将此ArrayList返回到另一个组件,并且不再使用当前组件(例如,您正在使用OSGi或其他模块系统),则可能会挂起仅由该匿名类链接的ClassLoader 另外,如果您关心序列化,则应在此新类中声明serialVersionID 即使您不在乎,也可能对此有警告。

好吧,首先,这取决于您希望对重复元素执行什么操作。 此代码将保留所有重复项(即,如果l1l2都包含"someString" ,则l将包含两个"someString" ),因此它实际上不是联合操作。 将其称为两个列表的串联将更准确。

除此之外,使用“双括号”实际上是创建扩展ArrayList的匿名类的实例。 我认为这是一种不良的代码风格。

List<String> l = new ArrayList<String>(l1);
l.addAll(l2);

更清晰,不再需要编写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM