How to quickly and conveniently create a one element arraylist
有什么实用方法可以在一行中做到这一点吗?我在Collections或List中找不到它。
1 2 3 4 5
| public List <String > stringToOneElementList (String s ) {
List <String > list = new ArrayList <String >();
list. add(s );
return list ;
} |
我不想重新发明轮子,除非我计划在它上安装花哨的轮圈。
好。。。类型可以是T,而不是String。但你明白了。(所有零位检查、安全检查等)
- 好吧,你根本不应该用那种方法。在您调用方法的地方,只需将调用替换为您正在寻找的"单行"转换。
- @罗伊特詹,你能详细说明你的意思吗?我不确定我明白。你说的"单线转换"是什么意思?
- 我是说,你想把方法里面的所有东西都转换成一行,对吗?好吧,那么这个方法并不是真的在做没有它就不能做的事情。你要做的是,return Arrays.asList(s);。但是,这个额外的方法有什么意义呢?它只是一个代表。把它取下来。无论你在哪里叫stringToOneElementList(s),就叫Arrays.asList(s),就是这样。
- 哦,好吧,我想我明白了。好吧,我使用这种方法的唯一原因是因为我不知道"神奇一行"在哪里。因此,这就是为什么我首先问这个stackoverflow问题。如果我已经知道一行Arrays.asList(s),那么为什么我要在stackoverflow上问我的问题?我很惊讶地发现这个方便方法在数组中而不是集合中。
- Arrays是一个实用程序类,包含您可能不时使用的各种其他方法。在Arrays类中使用此方法的原因是,此方法实际上正在从array转换为list。该方法被定义为接受var参数。所以,无论传递给它的参数是什么,都只能在内部转换为数组。然后从中创建一个列表。所以,那是它的指定地点——Arrays。
- Java中的设计是将任意数量的字符串转换成列表,其中包括1个字符串(但也意味着只有1种方法)。在其他语言中,做某件事的方法不止一种,所以我只想知道最好的方法(在本例中,只有一种方法),例如Ruby,你可以说"blah.first"和"blah.last",而不是像"blah[0]",这是非常方便和更易读的。在Java中,情况似乎并非如此。对不起,希望这是合理的
固定尺寸
List。
据我所知,最简单的方法是用Arrays.asList(T...)类创建固定大小的单个元素List
1 2
| // Returns a List backed by a varargs T.
return Arrays. asList(s ); |
变尺寸List。
如果它的大小需要不同,可以构造一个ArrayList和固定大小的List。
1
| return new ArrayList <String >(Arrays. asList(s )); |
并且(在Java 7 +中)您可以使用菱形运算符EDCOX1(6)来实现它。
1
| return new ArrayList <>(Arrays. asList(s )); |
- 这正是我要找的。谢谢您!我不知道为什么这是在数组中,而不是在列表、集合或任何东西中。
- 小心这个解决方案。您不能修改列表。例如,如果尝试向此列表中添加元素,它将引发一个UnsupportedOperationException!
- 如果s是一个非基元数组,也要小心。您将得到一个包含数组元素的列表,而不是一个包含数组的列表。(例如,Arrays.asList(new int[]{1,2,3})正常,但Arrays.asList(new String[]{"hello","world"})不正常。)
- collections.singletonlist(elm);更可取,因为它创建了不可变的列表。
- @拉维什巴格德夫-不总是。有时您可能希望稍后向列表中添加内容。实际上,我在图中的路径查找算法中使用了这个答案的方法。
- Intellij分析给出以下警告"只使用一个参数调用"aslist"
- 从JDK9开始,会有一个方法列表。(e e1)返回一个不可变的列表(下载.java. .net /java/jdk9/DOCS/API/Java/UTL/List.html和8203);
- 第一种方法的一个非常重要的缺点是,如果您稍后尝试将其转换为ArrayList,您将得到一个ClassCastException,因为Arrays.asList returns a List implementation, but it's not a java.util.ArrayList. It happens to have a classname of ArrayList, but that's a nested class within Arrays - a completely different type from java.util.ArrayList。
此方法创建的列表是不可变的。
- Intellij IDEA会自动推荐这一点,而不是Arrays.asList(object)。
- 请注意,此方法创建的列表是不可变的。
- 所以你没花时间写一行电话的后果?不变列表
- 请将此标记为已接受的答案。这比array.aslist更好。
您可以使用实用程序方法Arrays.asList并将结果馈送到新的ArrayList中。
1
| List <String > list = new ArrayList <String >(Arrays. asList(s )); |
其他选项:
1
| List <String > list = new ArrayList <String >(Collections. nCopies(1, s )); |
和
1
| List <String > list = new ArrayList <String >(Collections. singletonList(s )); |
- ArrayList(Collection)构造函数。
- Arrays.asList法。
- Collections.nCopies法。
- Collections.singletonList法。
使用Java 7 +,您可以使用"菱形操作符",用EDCOX1×14 14替换EDCOX1 OR 13。
爪哇9
如果使用Java 9 +,则可以使用EDCOX1×15的方法:
1
| List <String > list = new ArrayList <>(List. of(s )); |
无论使用上述每个选项,如果不需要列表可变,您可以选择不使用new ArrayList<>()包装器。
- 我很惊讶你是唯一一个提到Collections.singletonList的人。
- 更令我惊讶的是,@andyj在我的评论后发表了Collections.singletonList,得到的票数比你的答案多了2倍,而你的答案已经有了,而且已经存在了3年了……偶然发现旧的评论总是很有趣的。
使用Java 8流:
1
| Stream.of(object).collect(Collectors.toList()) |
或者如果你需要一套:
1
| Stream.of(object).collect(Collectors.toSet()) |
- 您还可以使用Guava的Sets.newHashSet(objects)创建新的集合。
- 我就是喜欢这个
另一个答案都使用Arrays.asList(),它返回一个不可修改的列表(如果试图添加或删除元素,则抛出UnsupportedOperationException)。为了得到一个可变的列表,您可以将返回的列表包装在一个新的ArrayList中,作为一对答案指出,但是一个更干净的解决方案是使用guava的list.newarraylist()(至少从2011年发布的guava 10开始提供)。
例如:
1
| Lists.newArrayList("Blargle!"); |
- 如果给定的元素实现了ITerable,例如:Lists.newArrayList(Paths.get("/usr/local/this/is/not/single/element"));您想要的是用单路径元素创建数组,但是,您得到的是一个包含7个路径元素的列表。
- 啊,我明白了。是的,默认情况下,Java将选择最具体的方法,在这种情况下是EDCOX1(7)。您可以执行Lists.newArrayList(new Path[] {Paths.get("/usr/local/this/is/not/single/??element")})来显式调用vararg方法,或者只构造一个空列表(List p = Lists.newArrayList()并添加元素(p.add(Paths.get("/usr/local/this/is/not/single/??element"))&zwnj;&8203;)。
非常简单:
当guava被提到时,我想我也会建议Eclipse集合(以前称为GS集合)。
以下示例都返回一个带有单个项的List。
1 2 3 4
| Lists.mutable.of("Just one item");
Lists.mutable.with("Or use with");
Lists.immutable.of("Maybe it must be immutable?");
Lists.immutable.with("And use with if you want"); |
其他集合也有类似的方法。
另一种选择是双括号初始化,例如
1
| new ArrayList<String>() {{ add(s); }}; |
但这是低效和模糊的。因此,仅适用于:
- 在不介意内存泄漏的代码中,例如大多数单元测试和其他短期程序;
- 如果其他的解决方案都不适用,我认为这意味着你已经向下滚动了一段时间,想要填充一个与问题中的arraylist不同类型的容器。
- - 1。它不仅次等,而且是无效的。传递以这种方式实例化的列表将导致创建它的对象不会被垃圾收集。即使你认为你已经把这个问题孤立起来,并把它包含在你的脑海中,告诉自己使用双支撑是安全的,因为它看起来很酷,但它充其量是不明智的。无论是谁在这个答案中找到了价值而不是娱乐性的(以及那些在其中找到娱乐价值的人已经知道这一点),都有可能继续进行并在他们的项目中写下这一点。
- @本巴凯,我不知道你的评论在第一个链接的讨论中添加了什么信息。无效程序不是无效程序。在这个答案中,我仍然发现了记住为什么不在项目中编写这个构造的价值。
- 我将避免关于有效性的讨论,因为它可能是一个语义相关的讨论(对问题有效,对绝对值有效)。这个评论所增加的价值是,它附加了一个重量警告,这个重量更接近于危险,就在思想本身旁边。效率低下、默默无闻和不便不是这项技术的主要障碍。
- 如果您编辑您的答案以反映使用此技术将导致内存泄漏,如果列表在实例之间共享,我将+1(结果为+0)。
- 此方法创建arraylist的子类…想一想。