2015-05-14 66 views
1

在我的代碼中的幾個地方中,我有ArrayLists和TreeSets,它們的泛型類型是我希望轉換的。例如,我有一個ArrayList<Integer>,我想轉換爲ArrayList<Long>。或者我有一個TreeSet<BigInteger>,我希望將其轉換爲TreeSet<String>在Java中轉換泛型集合的類型

所有這些轉換都可以完成,但是我必須爲每個類型轉換創建一個不同的函數。因此,我想創建一個通用的函數,其簽名看起來是這樣的:

public static <Q,T> Collection<Q> convert(Collection<T> col, Class<Q> Q) 

我想是從col獲取類(如ArrayList),創建該類的一個新的集合,然後鍵入Q(稱爲newCol ),然後遍歷col並將類型爲T的每個元素轉換爲Q類型,並將其添加到newCol,最後返回newCol

我該怎麼做?

+3

使用Java 8將會非常簡單。你可以使用Java 8嗎? –

回答

1

沒有像Java中不兼容的類的轉換的特殊機制。您需要指定一個將執行轉換的顯式函數。使用Java 8它真的很容易:

public static <Q,T,C extends Collection<Q>> C convert(Collection<T> col, Function<T, Q> fn, 
        Supplier<C> supplier) { 
    return col.stream().map(fn).collect(Collectors.toCollection(supplier)); 
} 

使用方法如下:

TreeSet<BigInteger> values = // fill them somehow 
TreeSet<String> converted = convert(values, BigInteger::toString, TreeSet::new); 
0

@Tagir Valeev是正確的。您可以在Java 8中輕鬆完成。但是,如果您使用Java 7,則可以嘗試執行以下操作:

public static <F, T> Collection<T> transform(Collection<F> fromCollection, Function<? super F, T> function) { 
     return new TransformedCollection<F, T>(fromCollection, function); 
    } 

    static class TransformedCollection<F, T> extends AbstractCollection<T> { 
     final Collection<F> fromCollection; 
     final Function<? super F, ? extends T> function; 

     TransformedCollection(Collection<F> fromCollection, Function<? super F, ? extends T> function) { 
      this.fromCollection = checkNotNull(fromCollection); 
      this.function = checkNotNull(function); 
     } 

     @Override public void clear() { 
      fromCollection.clear(); 
     } 

     @Override public boolean isEmpty() { 
      return fromCollection.isEmpty(); 
     } 

     @Override public Iterator<T> iterator() { 
      return Iterators.transform(fromCollection.iterator(), function); 
     } 

     @Override public int size() { 
      return fromCollection.size(); 
     } 
    } 

它是來自Guava庫的代碼。