首页 > Java > 在一行中初始化数组列表

在一行中初始化数组列表

上一篇 下一篇

我想创建一个用于测试目的的选项列表。起初,我这样做了:

ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

然后,我重构了代码,如下所示:

ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

有没有更好的方法可以做到这一点?

分割线

网友回答:

实际上,初始化 的“最佳”方法可能是您编写的方法,因为它不需要以任何方式创建新的方法:ArrayListList

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

问题是引用该实例需要相当多的键入。list

还有其他方法,例如使用实例初始值设定项创建匿名内部类(也称为“双大括号初始化”):

ArrayList<String> list = new ArrayList<String>() {{
    add("A");
    add("B");
    add("C");
}};

但是,我不太喜欢这种方法,因为您最终得到的是一个子类,其具有实例初始值设定项,并且创建该类只是为了创建一个对象 – 这对我来说似乎有点矫枉过正。ArrayList

如果 Project Coin 的 Collection Literals 提案被接受,那就太好了(它计划在 Java 7 中引入,但它也不太可能成为 Java 8 的一部分)。

List<String> list = ["A", "B", "C"];

不幸的是,它在这里不会帮助你,因为它将初始化一个不可变的而不是一个,此外,它还不可用,如果有的话。ListArrayList

分割线

网友回答:

如果你只是把它声明为一个会更简单——它必须是 ArrayList 吗?List

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

或者,如果您只有一个元素:

List<String> places = Collections.singletonList("Buenos Aires");

这意味着它是不可变的(尝试更改它会导致引发异常)。placesUnsupportedOperationException

要创建一个具体的可变列表,您可以从不可变列表创建一个:ArrayListArrayList

ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

并导入正确的包:

import java.util.Arrays;

分割线

网友回答:

简单的答案

Java 9 或更高版本:

List<String> strings = List.of("foo", "bar", "baz");

这将给你一个 不可变的 ,所以它不能被改变。
在大多数情况下,这是您想要的,您正在预填充它。
List

Java 8 or earlier:

List<String> strings = Arrays.asList("foo", "bar", "baz");

This will give you a * backed by an array, so it cannot change length.
But you can call , so it’s still mutable.
ListList.set(...)

*
实现细节:它是java.util.Arrays中的一个私有嵌套类,名为ArrayList,它与java.util.ArrayList不同,
即使它们的简单名称相同。

静态导入

你可以通过静态导入使Java 8更短:Arrays.asList

import static java.util.Arrays.asList;  
...
List<String> strings = asList("foo", "bar", "baz");

任何现代 IDE* 都会为您建议并执行此操作。

我不建议将该方法静态导入为 ,因为它令人困惑。List.ofof

*
例如,在IntelliJ IDEA中,您按Alt + Enter并选择静态导入方法...

使用 sStream

为什么它必须是 ?
在 Java 8 或更高版本中,您可以使用更灵活的:
ListStream

Stream<String> strings = Stream.of("foo", "bar", "baz");

您可以连接 s:Stream

Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
                                       Stream.of("baz", "qux"));

或者你可以从 a 转到 :StreamList

import static java.util.stream.Collectors.toList;
...
var strings = Stream.of("foo", "bar", "baz").toList(); // Java 16

List<String> strings = Stream.of("foo", "bar", "baz").collect(toList()); // Java 8

但最好是,只需使用 而不将其收集到 .StreamList

如果您特别需要java.util.ArrayList*

如果要填充 a 并在之后添加它,请使用ArrayList

List<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");

或在 Java 8 或更早版本中:

List<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");

或使用 :Stream

import static java.util.stream.Collectors.toCollection;

List<String> strings = Stream.of("foo", "bar")
                             .collect(toCollection(ArrayList::new));
strings.add("baz");

但同样,最好直接使用 而不是将其收集到 .StreamList

*您可能不需要专门用于 ArrayList。引用JEP 269:

一小组用例可用于使用预定义的值集初始化可变集合实例。通常最好将这些预定义值放在不可变集合中,然后通过复制构造函数初始化可变集合。

(强调我的)

编程到接口,而不是实现

您说您已在代码中将列表声明为 ,但仅当您使用不在 中的某个成员时才应这样做。ArrayListArrayListList

你很可能没有这样做。

通常,您应该通过要使用的最通用接口(例如,,或)声明变量,并使用特定的实现(例如,或)初始化它们。IterableCollectionListArrayListLinkedListArrays.asList()

否则,您将代码限制为该特定类型,并且在需要时将更难更改。

例如,如果要将 :ArrayListvoid method(...)

// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) { 
    for (String s : strings) { ... } 
}

// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
    if (!strings.isEmpty()) { strings.stream()... }
}

// List if you also need random access, .get(index):
void method(List<String> strings) {
    strings.get(...)
}

// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
    ??? // You don't want to limit yourself to just ArrayList
}

另一个例子是总是声明变量 a 即使它通常是 a 或 a ,因为很快有一天你或其他人会想要使用其他类型的 .InputStreamFileInputStreamBufferedInputStreamInputStream

模板简介:该模板名称为【在一行中初始化数组列表】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 219次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-13
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信模板 单页式简历模板 企业网站 html5 响应式 微信文章 微信素材 微信图片 自适应 微信公众平台
您可能会喜欢的其他模板