关于java:如何快速方便地创建一个元素arraylist

How to quickly and conveniently create a one element arraylist

本问题已经有最佳答案,请猛点这里访问。

有什么实用方法可以在一行中做到这一点吗?我在CollectionsList中找不到它。

1
2
3
4
5
public List<String> stringToOneElementList(String s) {
    List<String> list = new ArrayList<String>();
    list.add(s);
    return list;
}

我不想重新发明轮子,除非我计划在它上安装花哨的轮圈。

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


固定尺寸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));


1
Collections.singletonList(object)

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


您可以使用实用程序方法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<>()包装器。


使用Java 8流:

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

或者如果你需要一套:

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


另一个答案都使用Arrays.asList(),它返回一个不可修改的列表(如果试图添加或删除元素,则抛出UnsupportedOperationException)。为了得到一个可变的列表,您可以将返回的列表包装在一个新的ArrayList中,作为一对答案指出,但是一个更干净的解决方案是使用guava的list.newarraylist()(至少从2011年发布的guava 10开始提供)。

例如:

1
Lists.newArrayList("Blargle!");


非常简单:

1
Arrays.asList("Hi!")


当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不同类型的容器。