我需要将任意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));
}

09-27 19:44