Java 将 Collection<T> 映射到 Collection<U>

标签 java generics

我需要转换任意 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/

相关文章:

java - 使用java进行LDAP AD分页

java - Java中类名后的冒号是做什么用的

java - 该程序是否引入了并行执行?

c# - 如何定义实现接口(interface)并约束类型参数的泛型类?

c# - 如何获取从泛型类继承的集合的所有类型?

java String 非原始类型的泛型类

java - 如何在Spring表单中隐藏选项?

java - xmlPath 无法从 xml 中获取要列出的特定对象

c# - 不知道类型时如何指定类型化变量

c# - 如何使方法的返回对象通用?