在Java中转换泛型集合的类型
在我的代码中有几个地方我有ArrayList和TreeSet,我希望转换它们的泛型类型。例如,我有一个在Java中转换泛型集合的类型,java,generics,collections,Java,Generics,Collections,在我的代码中有几个地方我有ArrayList和TreeSet,我希望转换它们的泛型类型。例如,我有一个ArrayList,我想把它转换成ArrayList。或者我有一个TreeSet,我想把它转换成TreeSet 所有这些转换都可以进行,但是我必须为每个类型转换创建一个不同的函数。因此,我想创建一个通用函数,其签名如下: public static <Q,T> Collection<Q> convert(Collection<T> col, Class<
ArrayList
,我想把它转换成ArrayList
。或者我有一个TreeSet
,我想把它转换成TreeSet
所有这些转换都可以进行,但是我必须为每个类型转换创建一个不同的函数。因此,我想创建一个通用函数,其签名如下:
public static <Q,T> Collection<Q> convert(Collection<T> col, Class<Q> Q)
公共静态集合转换(集合列,Q类)
我想要的是从col
(例如ArrayList
)获取类,创建该类的新集合并键入Q
(称为newCol
),然后遍历col
,将T
类型的每个元素转换为Q
类型,并将其添加到newCol
中,最后返回newCol
我怎样才能做到这一点?在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));
}
公共静态C转换(收集列、函数fn、,
供应商(供应商){
返回col.stream().map(fn.collect(Collectors.toCollection(supplier));
}
像这样使用它:
TreeSet<BigInteger> values = // fill them somehow
TreeSet<String> converted = convert(values, BigInteger::toString, TreeSet::new);
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();
}
}
TreeSet值=//以某种方式填充它们
TreeSet converted=转换(值,BigInteger::toString,TreeSet::new);
@Tagir Valeev是正确的。您可以在Java8中轻松地完成这项工作。但如果您使用Java 7,您可以尝试执行以下操作:
TreeSet<BigInteger> values = // fill them somehow
TreeSet<String> converted = convert(values, BigInteger::toString, TreeSet::new);
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();
}
}
publicstaticcollection转换(Collection fromCollection,functionusingjava8)非常简单。你能用java8吗?