将对象包装在集合中的实用方法

Posted

技术标签:

【中文标题】将对象包装在集合中的实用方法【英文标题】:Utility method for wrapping an object in a collection 【发布时间】:2012-04-23 17:59:43 【问题描述】:

我正在 Java 核心库或其他一些常用的依赖项(最好是 Apache 中的一个)中寻找一个静态方法,它执行以下操作:

public static <T> Collection<T> wrap(final T object)
    final Collection<T> collection = new ArrayList<T>();
    collection.add(object);
    return collection;

你知道哪里已经有这样的方法了吗?由于我猜这个问题很常见,我不想复制它的解决方案。

【问题讨论】:

【参考方案1】:

java.util.Collections.singleton(object) 会给你一个不可变的SetsingletonList 也可以。

效率较低的java.util.Arrays.asList(object) 将为您提供一个可变的(可以使用list.set(0, x);),但在结构上不可更改(无法添加或删除)List。它有点贵,因为有一个额外的数组是在客户端创建的。

【讨论】:

还有Collections.singletonList(object)【参考方案2】:

从 Java 8 开始,以下是一些在 List 中包装 Java 对象的有效方法。

Collections.singletonList:单项,不可变,从 1.3 开始。 Collections.singletonList( object ) 内部类支持的高性能。

Collections.nCopies:从 1.2 开始,一个对象,0 到许多项,不可变。 Collections.nCopies( number_of_copy, object ) 内部类支持的高性能。所有项目都指向同一个对象。

Array.asList:从 1.2 开始,任意数量的对象,size 不可变(单个元素可变)。 Arrays.asList( object1, object2, object3 ) 由内部类支持。项目被转换为数组at compile time,并且这个数组直接支持列表。

新的ArrayList(Collection):自 1.2 起,任意数量的对象,可变的new ArrayList&lt;&gt;( Arrays.asList( object1, object2, object3 ) ) ArrayList 是使用array clone 和array copy 创建的,因此不使用任何循环。

【讨论】:

【参考方案3】:

Immutable list in guava

public static <E> ImmutableList<E> of(E element)

返回一个包含单个元素的不可变列表。这份名单 行为和执行与 Collections.singleton(T) 相当,但会 不接受空元素。主要是为了一致性和 代码的可维护性。

【讨论】:

感谢您的提示,但不幸的是我不能使用 Guava。【参考方案4】:

不要害怕自己写东西。据我所知是不存在的。我认为这样做的一个原因是实用程序方法决定了它使用的 Collection 实现。在您的情况下,您选择了 ArrayList,但还有一大堆其他集合。

【讨论】:

【参考方案5】:

java.util.Collections.singletonList() 或 singleton()。请注意,结果是不可变的。

【讨论】:

以上是关于将对象包装在集合中的实用方法的主要内容,如果未能解决你的问题,请参考以下文章

Java 中必的常用类(很实用)

在 Java 中交换两个字符串,通过将它们传递给实用程序函数,但不返回对象或使用包装类

JAVA中,基本类型的包装类

深度克隆实用程序推荐 [关闭]

深度克隆实用程序推荐 [关闭]

持有对象(集合)