某处是否有实用程序方法可以在一行中完成?我在CollectionsList的任何地方都找不到它。

public List<String> stringToOneElementList(String s) {
    List<String> list = new ArrayList<String>();
    list.add(s);
    return list;
}


除非我计划在上面花哨的轮辋,否则我不想重新发明轮子。 。

......类型可以是T,而不是String。但是你明白了。 (以及所有的null检查,安全检查...等)

评论

好吧,您根本不应该使用该方法。调用该方法的地方,只需用您要查找的“单行”转换替换该调用即可。

我的意思是,您想将方法内部的所有内容都转换为一行吗?好吧,那该方法实际上并没有做任何没有它就无法完成的工作。您要做的是返回Arrays.asList(s);。但是,这种额外方法的意义何在?它只是充当代表。只需将其删除。无论您在哪里调用stringToOneElementList(s),都可以调用Arrays.asList(s)。

哦,好的,我想我明白了。好吧,我拥有该方法的唯一原因是因为我不知道“魔术贴”在哪里。因此,这就是为什么我首先问这个stackoverflow问题的原因。如果我已经知道那一行Arrays.asList(s),那为什么我要在stackoverflow上问我一个问题?我很惊讶地发现此便捷方法位于数组而不是集合中。

数组是一个实用程序类,其中包含您可能不时使用的其他各种方法。 Arrays类中此方法的原因是,该方法实际上是从数组转换为列表。该方法定义为采用var-args。因此,传递给它的任何参数都只会在内部转换为数组。然后从中创建一个列表。因此,这是它的指定位置-数组。

Java的设计是将任意数量的字符串转换为列表,其中仅包含1个字符串(但这也意味着只有一种方式可以这样做)。在其他语言中,做某事的方法不止一种,所以我只想知道最好的方法(在这种情况下,只有一种方法),例如,ruby,您可以说“ blah.first”和“ blah.last” ”,而不是“ blah [0]”,它非常方便且可读性强。在Java中,情况似乎并非如此。抱歉,希望有道理

#1 楼

固定大小的List


我知道,最简单的方法是使用List创建固定大小的单个元素Arrays.asList(T...),例如

// Returns a List backed by a varargs T.
return Arrays.asList(s);


大小可变的List


如果需要大小不同,可以构造一个ArrayList和固定大小的List,如

return new ArrayList<String>(Arrays.asList(s));


(在Java 7+中),您可以使用菱形运算符<>使其成为

return new ArrayList<>(Arrays.asList(s));


单个元素列表

集合可以返回具有单个元素且列表是不可变的列表:

Collections.singletonList(s)


这里的好处是IDE代码分析不会警告单个元素asList(..)调用。

评论


正是我想要的。谢谢!我不知道为什么这是在数组而不是列表,或集合或其他。

– David T.
2013年12月3日18:45

请谨慎使用此解决方案。您无法修改列表。例如,如果尝试将元素添加到此List中,它将抛出UnsupportedOperationException!

–亚当山
2014年8月28日在9:33



Collections.singletonList(elm);更可取,因为它会创建不可变的列表。

–狂热的巴格德夫
2015年6月3日,10:39

@RavishBhagdev-并非总是如此。有时您可能想稍后将内容添加到列表中。实际上,我在图形的寻路算法中完全使用了此答案的方法。

–超音速项目
16 Mar 17 '16 at 22:48

从JDK9开始,将有一个方法List.of(E e1)返回一个不可变的列表(download.java.net/java/jdk9/docs/api/java/util/List.html#of-E-)

–尼古拉
17年8月25日在10:25



#2 楼

Collections.singletonList(object)


用此方法创建的列表是不可变的。

评论


IntelliJ IDEA会自动推荐此方法,而不是Arrays.asList(object)。

–马泰
2015年10月15日13:36

请注意,此方法创建的列表是不可变的。

– Mandar Pathak
16年8月9日,0:52

这样您就不会花时间写此电话的后果一行吗?不可变的清单

–马丁·阿塞诺夫(Martin Asenov)
18年8月27日在14:44

请将此标记为可接受的答案。这比Arrays.asList更好。

– Orri
18-10-18在7:41

#3 楼

您可以使用实用程序方法Arrays.asList并将结果输入新的ArrayList

List<String> list = new ArrayList<String>(Arrays.asList(s));


其他选项:

List<String> list = new ArrayList<String>(Collections.nCopies(1, s));




List<String> list = new ArrayList<String>(Collections.singletonList(s));




ArrayList(Collection)构造函数。

Arrays.asList方法。

Collections.nCopies方法。

Collections.singletonList方法。

对于Java 7+,您可以使用“钻石运算符”,将new ArrayList<String>(...)替换为new ArrayList<>(...)

Java 9

如果使用的是Java 9+,则可以使用List.of方法:

List<String> list = new ArrayList<>(List.of(s));


不管使用每个选项上面,如果您不需要可变的列表,则可以选择不使用new ArrayList<>()包装器。

评论


我很惊讶您是唯一提及Collections.singletonList的人。

–让·弗朗索瓦·萨瓦德(Jean-FrançoisSavard)
15年5月26日在0:11

@AndyJ在我发表评论后发布了Collections.singletonList,并使您获得的投票数比您已经拥有了3年的答案多2倍,这让我感到更加惊讶。

–让·弗朗索瓦·萨瓦德(Jean-FrançoisSavard)
16年5月20日在16:47

#4 楼

使用Java 8 Streams:

Stream.of(object).collect(Collectors.toList())


,或者如果需要一套:

Stream.of(object).collect(Collectors.toSet())


评论


您也可以使用Guava的Sets.newHashSet(objects)创建一个新集合。

–马特西亚斯·布劳恩(Matthias Braun)
2015年12月7日15:51

我只是喜欢这个

–wild_nothing
19年2月5日在16:28

#5 楼

其他答案都使用Arrays.asList(),它返回一个不可修改的列表(如果尝试添加或删除元素,则会抛出UnsupportedOperationException)。要获得可变的列表,您可以将返回的列表包装在新的ArrayList中,以指出几个答案,但是更干净的解决方案是使用Guava的Lists.newArrayList()(至少从2011年发布的Guava 10起可用)。

例如:

Lists.newArrayList("Blargle!");


评论


如果给定元素实现Iterable ,则此方法不起作用,例如:Lists.newArrayList(Paths.get(“ / usr / local / this / is / not / single / element”));您想要的是使用单个路径元素创建数组,但是,您得到的是一个包含7个路径元素的列表。

–鲍勃
16 Dec 6'2:52



知道了是,默认情况下,是,Java将选择最特定的方法,在这种情况下为Lists#newArrayList(Iterable <?扩展E>元素)。您可以执行Lists.newArrayList(new Path [] {Paths.get(“ / usr / local / this / is / not / single / ‌élement”)})来显式调用vararg方法,或仅构造一个空列表(List p = Lists.newArrayList())并添加元素(p.add(Paths.get(“ / usr / local / this / is / not / single / ‌ / element”)))。

–user167019
16 Dec 18'在20:33



#6 楼

非常简单:

Arrays.asList("Hi!")


#7 楼

看到Guava被提及时,我想我也建议您使用Eclipse Collections(以前称为GS Collections)。

以下示例均返回带有单个项目的List

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");


其他集合也有类似的方法。

#8 楼

另一种选择是双括号初始化,例如

new ArrayList<String>() {{ add(s); }};


,但是效率低下且晦涩难懂。因此,仅适用于:


在不介意内存泄漏的代码中,例如大多数单元测试和其他短期程序;
,如果没有其他解决方案适用,我认为这意味着您一直在此处向下滚动,以寻找与问题中的ArrayList不同的容器类型。


评论


-1。它不仅劣等,而且也是无效的。传递以这种方式实例化的列表将导致创建该对象的对象不会被垃圾回收。即使您认为自己的问题已被隔离并包含在您的脑海中,并告诉自己使用双括号是安全的,因为它看起来真是太酷了,但最好不要这样做。除了娱乐性之外,在此答案中发现价值的人(而那些在其中发现娱乐性价值的人已经知道这一点)可能会继续并将其写在他们的项目中。

– Ben Barkay
16 Sep 8'在18:30



@BenBarkay我看不到您的评论在第一个链接中为讨论添加的信息。效率低下的程序不是无效程序。我仍在此答案中找到价值,因为它记住了为什么不在项目中编写此构造。

–斯坦
16年9月9日在12:55

我将避免围绕有效性进行讨论,因为它很可能是一种与语义相关的问题(对问题有效而在绝对意义上有效)。该注释增加的价值是,它紧随该想法本身之后附加了一个警告,该警告更接近于危险。效率低下,模糊不清和不便不是该技术的主要功能障碍。

– Ben Barkay
16 Sep 9'在13:52



如果您编辑答案以反映该技术的使用将导致内存泄漏(如果在实例之间共享列表),那么我将+1(导致+ -0)。

– Ben Barkay
16 Sep 9'在14:17



这种方法创建了ArrayList的子类...考虑一下。

– Orri
18-10-18在7:42