首先我要承认,删除可能会使这一切变得不可能。这是我正在尝试做的事情,但不起作用:
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class Suppliers {
public static <CollectionType, T> CollectionType<T>
fill(CollectionType colltype, Supplier<T> gen, int n) {
return Stream.generate(gen)
.limit(n)
.collect(colltype::new, colltype::add, colltype::addAll);
}
}
目标是生成 CollectionType
的实例,并使用 gen
用 n
项填充它。这种形式的collect()
确实实例化了一个新集合,但我不清楚该类型是否可以通过fill()
的参数列表传递。 fill()
方法不必看起来完全是这样,只要它实例化一个新集合并填充它并返回结果即可。
最佳答案
您的想法是正确的,但您想要的是:
<T, C extends Collection<T>> C fill(Supplier<T> gen,
int n,
Supplier<C> factory) {
return Stream.generate(gen)
.limit(n)
.collect(factory, C::add, C::addAll);
}
然后你可以这样调用它:
HashSet<String> strings = fill(() -> "Foo", 10, HashSet::new);
此技术用于诸如 4-arg 版本的 Collectors.toMap()
之类的方法中。
关于Java 8 Stream.collect() 的通用使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34801965/