ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-05-19 21:07:22  阅读:168  来源: 互联网

标签:Java Stream ArrayList List Debug bar strings


本文正在参加「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-stackoverflow-com.translate.goog/questions/2…

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

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

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

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

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

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

标签:Java,Stream,ArrayList,List,Debug,bar,strings
来源: https://blog.51cto.com/u_10182395/2787122

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有