Java 8 - 使用 Stream API 用相同对象填充数组列表的正确方法是什么?

标签 java arraylist collections java-stream

我是 Stream API 的新手,我正在寻找更优雅和最短的方法来使用等效于此代码的 Stream API 用相同的对象填充 ArrayList:

SomeObject someObject = new SomeObject();
List<SomeObject> someObjectList = new ArrayList<>();

int maxLimitValue = 70; //for example
for(int i=0; i<=maxLimitValue; i++){
   someObjectList.add(someObject);
}

我已经看到许多针对我当前任务的不同解决方案:

This variant几乎是我想要的,但是有一个自动生成的对象,但我需要使用创建一次的同一个对象。

This solution也几乎是我需要的,但是我不确定这个对象的复制和返回的列表类型不是 ArrayList(它返回的是CopiesList类型,在以后的操作中不能添加到ArrayList ).

附注也许它可能重复,但我真的找不到使用 Stream API 执行此操作的正确且简短的方法。

更新(assylias 添加):

是的,我同意你关于这个变体的看法:

List<SomeObject> list = Collections.nCopies(70, someObject);

但是,当我打开这个方法时:

public static <T> List<T> nCopies(int n, T o) {
        if (n < 0)
            throw new IllegalArgumentException("List length = " + n);
        return new CopiesList<>(n, o);
    }

正如我们所见 - 它返回 CopiesList 对象,而不是 ArrayList。 此外,与其他列表一样,它扩展了 AbstractList:

private static class CopiesList<E>
        extends AbstractList<E>
        implements RandomAccess, Serializable
    {
        private static final long serialVersionUID = 2739099268398711800L;

        final int n;
        final E element;

        CopiesList(int n, E e) {
            assert n >= 0;
            this.n = n;
            element = e;
        }
...}

它不完全是 ArrayList,但感谢您的建议和忠告,没有空话和离题评论,我会使用您的解决方案。

最佳答案

您可以手动构建流:

List<SomeObject> list = Stream.generate(() -> someObject).limit(70).collect(toList());
//or if you want to make sure you get an ArrayList:
List<SomeObject> list = Stream.generate(() -> someObject).limit(70).collect(toCollection(ArrayList::new));

尽管为此目的创建一个流可能效率很低,但我可能会按照@Eran 的建议去做:

List<SomeObject> list = Collections.nCopies(70, someObject);
//or if you want to make sure you get an ArrayList:
List<SomeObject> list = new ArrayList<> (Collections.nCopies(70, someObject));

关于Java 8 - 使用 Stream API 用相同对象填充数组列表的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40258194/

相关文章:

java - 使用 Iterator 从 List 中删除包含 null 的元素

java - Google App Engine 数组列表不是受支持的属性类型

java - 如果我想使用Java从网页中获取数据,我应该从哪里开始呢?

java - 将 Akka HTTP 部署到 Azure

java - Android - 具有嵌套信息和数组的 GenericJson

java - 添加到ArrayList

java - Future 任务什么时候完成

java - 程序将一个字符添加到字符串,然后通过 toString() 方法显示结果,并通过 length() 计算字符串的数量

java - 使用属性在 arraylist 中创建新对象

java - 集合中的内存消耗