Java map Collection到Collection
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java map Collection到Collection相关的知识,希望对你有一定的参考价值。
我需要将任意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));
作为旁注,我认为您有两个类型变量太多。您可以省去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));
另一答案
在我看来,我建议一种不同的解决方案:
public static <T, U> List<U> convert(Collection<T> collection, Function<T, U> mapper)
return collection.stream()
.map(mapper)
.collect(Collectors.toList());
以上是关于Java map Collection到Collection的主要内容,如果未能解决你的问题,请参考以下文章