是否有通过多次调用函数来填充List的Java方法?

时间:2015-02-24 20:16:07

标签: java collections functional-programming java-8

标准库中有这样的东西吗?它通过调用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());
}

2 个答案:

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

这使得流始终为SIZEDCollections.nCopies().stream()实际上在内部使用IntStream.range()因此它不会更快或更快。

使用Collectors.toCollection()可以控制列表的具体类型,toList()不会。在连续的情况下,这也允许您预先调整列表的大小,避免在将元素添加到列表时可能发生的复制。

(公平警告:在JDK 8中,toList()创建了一个ArrayList,但我们可能会在JDK 9中对此进行更改,以返回更适合追加的列表类型。)