Java map Collection 到Collection

问题描述 投票:0回答:2

我需要将任意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);
    }
}
java generics
2个回答
1
投票

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));
}

作为旁注,我认为您有两个类型变量太多。您可以省去Collection类型变量...

public static <T, U> Collection<U> 
    MappedCollection(Collection<T> collection, 
                     Function<T, U> function, 
                     Supplier<Collection<U>> collectionSupplier) {
    return MappedStream(collection.stream(), function)
           .collect(Collectors.toCollection(collectionSupplier));
}

-1
投票

在我看来,我建议一种不同的解决方案:

public static <T, U> List<U> convert(Collection<T> collection, Function<T, U> mapper) {
    return collection.stream()
        .map(mapper)
        .collect(Collectors.toList());
}
© www.soinside.com 2019 - 2024. All rights reserved.