我需要转换任意 Collection<T>
进入另一个任意Collection<U>
。例如我想改造一个ArrayList<String>
进入HashSet<Integer>
.
我编写了以下代码,这给了我 UCollection::new
上的编译时错误(无法解析构造函数“UCollection”)。我尝试将其替换为 () -> new UCollection()
,这给了我另一个编译时错误(类型参数“UCollection”无法直接实例化)。
import java.util.Collection;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Utils {
public static <T, U, TCollection extends Collection<T>, UCollection extends Collection<U>>
UCollection MappedCollection(TCollection collection, Function<T, U> function) {
return MappedStream(collection.stream(), function).collect(Collectors.toCollection(UCollection::new));
}
public static <T, U> Stream<U> MappedStream(Stream<T> stream, Function<T, U> function) {
return stream.map(function);
}
}
最佳答案
UCollection::new
无效,因为 UCollection
是类型变量。您无法在方法中构造您不知道的类型。
这里最简单的解决方法是让您的调用者提供一个 UCollection
工厂:
public static <T, U, TCollection extends Collection<T>,
UCollection extends Collection<U>>
UCollection MappedCollection(TCollection collection,
Function<T, U> function,
Supplier<UCollection> uCollectionSupplier) {
return MappedStream(collection.stream(), function)
.collect(Collectors.toCollection(uCollectionSupplier));
}
顺便说一句,我认为你的一个类型变量太多了。您可以省去TCollection
(下面使用C
作为UCollection
)...
public static <T, U, C extends Collection<U>>
C mappedCollection(Collection<T> collection,
Function<T, U> function,
Supplier<C> collectionSupplier) {
return MappedStream(collection.stream(), function)
.collect(Collectors.toCollection(collectionSupplier));
}
关于Java 将 Collection<T> 映射到 Collection<U>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59684805/