将对象包装在集合中的实用方法
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)
会给你一个不可变的Set
。 singletonList
也可以。
效率较低的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<>( 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()。请注意,结果是不可变的。
【讨论】:
以上是关于将对象包装在集合中的实用方法的主要内容,如果未能解决你的问题,请参考以下文章