【问题标题】: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;
}

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

【问题讨论】:

    标签: java collections


    【解决方案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 clonearray 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()。请注意,结果是不可变的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-06
          • 1970-01-01
          • 2012-05-21
          相关资源
          最近更新 更多