使用重复元素创建列表

lau*_*urt 67 java

Java中是否有一个实用程序方法生成一个指定长度的列表或数组,所有元素都等于指定值(例如["foo","foo","foo","foo","foo"])?

ars*_*jii 116

你可以用Collections.nCopies.请注意,这会复制对给定对象的引用,而不是对象本身.如果你正在使用字符串,那么无关紧要,因为它们无论如何都是不可变的.

List<String> list = Collections.nCopies(5, "foo");
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)
[foo, foo, foo, foo, foo]

  • 完美的答案! (2认同)

Ren*_*ink 17

对于数组,您可以使用Arrays.fill(Object [] a,Object val)

String[] strArray = new String[10];
Arrays.fill(strArray, "foo");
Run Code Online (Sandbox Code Playgroud)

如果你需要一个清单,只需使用

List<String> asList = Arrays.asList(strArray);
Run Code Online (Sandbox Code Playgroud)

然后我必须使用两行:String [] strArray = new String [5]; Arrays.fill(strArray,"foo");. 有单线解决方案吗?

您可以使用Collections.nCopies(5,"foo")作为单行解决方案来获取列表:

List<String> strArray = Collections.nCopies(5, "foo");
Run Code Online (Sandbox Code Playgroud)

或者与它结合toArray以获得一个数组.

String[] strArray = Collections.nCopies(5, "foo").toArray(new String[5]);
Run Code Online (Sandbox Code Playgroud)


use*_*er7 11

使用IntStream,您可以生成一系列整数,将它们映射到所需的元素并将其收集为列表。

List<String> list = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者,作为数组

 String[] arr = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)


hoh*_*erg 7

如果您的对象不是不可变的或不是引用透明的,您可以使用

Stream.generate(YourClass::new).limit(<count>)
Run Code Online (Sandbox Code Playgroud)

并收集它以列出

.collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

或阵列

.toArray(YourClass[]::new)
Run Code Online (Sandbox Code Playgroud)


max*_*ver 6

可用于原始数组的版本(Java 8):

DoubleStream.generate(() -> 123.42).limit(777).toArray(); // returns array of 777 123.42 double vals
Run Code Online (Sandbox Code Playgroud)

请注意,它返回double[],而不是Double[]

适用于 IntegerStream、DoubleStream、LongStream

UPD

对于字符串重复,您可以使用:

Stream.generate(() -> "value").limit(400).toArray()

不需要额外的库,单行