一行初始化ArrayList?推荐| Java Debug 笔记

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

提问:一行初始化ArrayList

我想创建用于测试目的的选项列表。首先,我这样做:

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

然后,我将代码重构如下:

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

有一个更好的方法吗?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}很多的知识点,真的需要写出来才会掌握!!! 

简单的答案 Java 10或更高版本:

var strings = List.of("foo", "bar", "baz");

复制代码

这将为您提供一成不变的 List,因此无法更改。 在大多数情况下,这是您想要的。

Java 9

如果您使用的是Java 9,则不能使用var关键字:


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

复制代码

Java 8或更早版本:

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

这将为您提供List*,并带有数组作为后盾,因此它不能更改长度。

*实现细节:这是一个私有嵌套类java.util.Arrays,名为ArrayList,尽管它们的简单名称相同,但 与的类不同java.util.ArrayList。 静态导入

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

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

复制代码

任何现代的IDE *都会为您提供建议和帮助。

我不建议将静态List.of方法静态导入为just of,因为这很令人困惑。

*例如,在IntelliJ IDEA中,按Alt+Enter并选择Static import method... 使用Streams

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


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

您可以串联Stream:

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

或者,您可以从Stream转到List:

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

复制代码

但最好使用Stream而不将其收集到中List。 如果您特别需要java.util.ArrayList*

如果你想既预填充的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");

复制代码

但同样,最好Stream直接使用Direct而不是将其收集到中List。

*您可能不需要特别的ArrayList。引用JEP 269:

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

(强调我的) 程序接口,而不是实现

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

您最有可能不这样做。

通常你应该只通过通用接口,你要使用(例如声明变量Iterable,Collection或List),并与具体的实施对它们进行初始化(例如ArrayList,LinkedList或Arrays.asList())。

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

例如,如果您将传递ArrayList给void 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 .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
}
复制代码

文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-*-com.translate.goog/questions/2…

作者建议:你现在用的哪个版本就用哪个。用流可以装x

欢迎关注我的专栏*,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏*,我会筛选优质的问答,面试常考!!!{~}欢迎关注我的专栏*,我会筛选优质的问答,面试常考!!! 

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞???? 求关注❤️ 求分享???? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️

上一篇:PORTE_ISFR & (1<


下一篇:
有关Gcd,Lcm的一点小结论