标准库中有这样的东西吗?它通过调用List<T>
填充source.get()
:
public static <T> List<T> listFromFunc(int size, Supplier<T> source) {
return IntStream.range(0, size)
.mapToObj(i -> source.get())
.collect(Collectors.toList());
}
答案 0 :(得分:4)
我不敢,但您可以使用此构造提高代码的可读性
Stream.generate(source).limit(size).collect(Collectors.toList())
虽然作为Brian Goetz mentioned,您的原始版本会更好地并行化。
答案 1 :(得分:2)
这是另一种变体:
static <T> List<T> listFromFunc(int size, Supplier<T> source) {
return Collections.nCopies(size, "").stream()
.map(o -> source.get())
.collect(Collectors.toCollection(() -> new ArrayList<>(size)));
}
这使得流始终为SIZED
。 Collections.nCopies().stream()
实际上在内部使用IntStream.range()
因此它不会更快或更快。
使用Collectors.toCollection()
可以控制列表的具体类型,toList()
不会。在连续的情况下,这也允许您预先调整列表的大小,避免在将元素添加到列表时可能发生的复制。
(公平警告:在JDK 8中,toList()
创建了一个ArrayList
,但我们可能会在JDK 9中对此进行更改,以返回更适合追加的列表类型。)