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

Ale*_*mov 1 java collections arraylist 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);
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了许多不同的解决方案来完成当前的任

这个变体几乎就是我想要的,但是有一个对象的自动生成,但我需要使用一次创建的相同对象.

这个解决方案也几乎是我需要的,但我不确定这个对象的复制,返回的List类型不是 ArrayList(它返回了CopiesList类型,在将来的操作中无法添加到ArrayList).

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

更新(assylias添加):

是的,我同意你的观点:

List<SomeObject> list = Collections.nCopies(70, someObject);
Run Code Online (Sandbox Code Playgroud)

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

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

正如我们所见 - 它返回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;
        }
...}
Run Code Online (Sandbox Code Playgroud)

这不是ArrayList,但感谢您的建议和建议,没有空话和偏离主题的评论,我将使用您的解决方案.

ass*_*ias 6

您可以手动构建流:

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));
Run Code Online (Sandbox Code Playgroud)

虽然为此目的创建一个流可能效率低下,但我可能会选择@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));
Run Code Online (Sandbox Code Playgroud)

  • 你总是可以写`new ArrayList <>(Collections.nCopies(70,someObject))`但为什么你想要一个ArrayList? (2认同)
  • 请注意,使用`toList()`collector*的流解决方案发生*以返回`ArrayList`,但不保证它.你必须使用`toCollection(ArrayList :: new)`,如果它真的必须是一个`ArrayList`.但即使使用流,`Collections.nCopies(70,someObject).stream()`也可能是更有效的流源.它相当于`IntStream.range(0,70).mapToObj(i - > someObject)`... (2认同)