Java 如何快速方便地创建一个单元素arraylist

Java 如何快速方便地创建一个单元素arraylist,java,arraylist,collections,Java,Arraylist,Collections,有没有一个实用的方法可以在一行中实现这一点?我在集合或列表中的任何地方都找不到它 public List<String> stringToOneElementList(String s) { List<String> list = new ArrayList<String>(); list.add(s); return list; } List<String> list = new ArrayList<String&

有没有一个实用的方法可以在一行中实现这一点?我在
集合
列表
中的任何地方都找不到它

public List<String> stringToOneElementList(String s) {
    List<String> list = new ArrayList<String>();
    list.add(s);
    return list;
}
List<String> list = new ArrayList<String>(Arrays.asList(s));
public List stringToOneElementList(字符串s){
列表=新的ArrayList();
列表。添加(s);
退货清单;
}
我不想重新发明轮子,除非我打算在上面加上花哨的轮辋

嗯。。。类型可以是
T
,而不是
String
。但你明白了。(所有空值检查、安全检查等)

非常简单:

Arrays.asList("Hi!")
固定大小
列表
据我所知,最简单的方法是使用like创建一个固定大小的单个元素
List

可变大小
列表
如果需要不同的大小,您可以构建一个固定大小的
列表

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

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

您可以使用实用程序方法
Arrays.asList
,并将结果馈送到新的
ArrayList

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

不管上面每个选项的使用情况如何,如果您不需要列表是可变的,您可以选择不使用
新ArrayList()
包装器。

其他答案都使用
数组。asList()
,它返回一个不可修改的列表(如果您尝试添加或删除元素,将引发
UnsupportedOperationException
). 要获得一个可变列表,您可以将返回的列表包装在一个新的
ArrayList
中,正如一些答案所指出的那样,但是可以使用一个更干净的解决方案(至少从2011年发布以来就可以使用)

例如:

Lists.newArrayList("Blargle!");

另一种选择是,例如

newarraylist(){{add(s);};
但是。因此,仅适用于:

  • 在不介意内存泄漏的代码中,例如大多数单元测试和其他短期程序
  • 如果其他解决方案都不适用,我想这意味着您已经一直滚动到这里,希望填充与问题中的ArrayList不同类型的容器
此方法创建的列表是不可变的。

对于Java 8流:

Stream.of(object).collect(Collectors.toList())
或者,如果您需要一套:

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

鉴于番石榴被提及,我想我也会建议(以前称为GS系列)

以下示例都返回一个带有单个项目的
列表

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


其他收藏也有类似的方法。

嗯,你根本不应该使用这种方法。在调用方法的地方,只需将调用替换为您正在寻找的“单行”转换。我的意思是,您希望将方法中的所有内容都转换为单行,对吗?好吧,那么这个方法并不能真正做到没有它就做不到的事情。您要做的是,
返回Arrays.asList。但是那额外的方法有什么意义呢?它只是作为一个代表。把它拿走。无论你在哪里调用
stringToOneElementList
,都可以调用
Arrays.asList
,就是这样。哦,好的,我想我明白了。嗯,我使用这种方法的唯一原因是因为我不知道“神奇一行”在哪里。因此,这就是为什么我首先问这个问题。如果我已经知道一行
数组.asList
,那么我为什么要在这里问关于stackoverflow的问题?我惊讶地发现,这个方便的方法是在数组中,而不是在集合中。
Arrays
是一个实用类,包含您可能会不时使用的各种其他方法。在
数组
类中使用此方法的原因是,该方法实际上是从
数组
转换为
列表
。该方法被定义为采用var args。因此,传递给它的任何参数都只在内部转换为数组。然后从中创建一个列表。因此,这就是它的指定位置-
数组
。Java的设计是将任意数量的字符串转换为列表,其中只包含一个字符串(但也意味着只有一种方法可以这样做)。在其他语言中,做某事的方法不止一种,所以我只想知道最好的方法(在本例中,只有一种方法),例如ruby,你可以说“blah.first”和“blah.last”,而不是像“blah[0]”,这非常方便,可读性更强。在Java中,情况似乎并非如此。对不起,希望这是合理的这正是我想要的。非常感谢。我不知道为什么这是在数组中,而不是在列表中,或者在集合中,或者其他任何地方。使用这个解决方案时要小心。您不能修改列表。例如,如果您尝试将元素添加到此列表,它将抛出UnsupportedOperationException!收藏。单音列表(elm);更可取,因为它会创建不可变列表。@RavishBhagdev-不总是这样。有时,您可能希望稍后将内容添加到列表中。事实上,我在图形中的路径查找算法中使用了这个答案的方法​(E e1)返回一个不可变列表()我很惊讶你是唯一一个提到
集合的人。singletonList
。我更惊讶的是@AndyJ在我的评论后发布了
集合。singletonList
,获得的票数比你的答案多了2倍,而你的答案已经有了,而且从3年以来就一直存在。。。偶然发现旧注释总是很有趣的。IntelliJ IDEA会自动推荐此方法,而不是
数组。asList(object)
。请注意,此方法创建的列表是不可变的。所以您没有花时间写一行此调用的后果?不可变列表请将此标记为已接受的答案。这比Arrays.asList好得多。你也可以使用Guava的
集合。newHashSet(objects)
来创建一个新集合。我喜欢这个-1。它不仅低劣,而且无效。通过这种方式传递实例化的列表将导致创建它的对象不会被垃圾收集。即使你认为你的问题已经被隔离和控制了
Lists.newArrayList("Blargle!");
new ArrayList<String>() {{ add(s); }};
Collections.singletonList(object)
Stream.of(object).collect(Collectors.toList())
Stream.of(object).collect(Collectors.toSet())
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");