我是 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/