Java中是否有一个实用程序方法生成一个指定长度的列表或数组,所有元素都等于指定值(例如[“foo”,“foo”,“foo”,“foo”,“foo” ])?
答案 0 :(得分:102)
您可以使用Collections.nCopies
。请注意,这会将引用复制到给定对象,而不是对象本身。如果你正在使用字符串,那么无关紧要,因为它们无论如何都是不可变的。
List<String> list = Collections.nCopies(5, "foo");
System.out.println(list);
[foo, foo, foo, foo, foo]
答案 1 :(得分:15)
对于数组,您可以使用Arrays.fill(Object[] a, Object val)
String[] strArray = new String[10];
Arrays.fill(strArray, "foo");
如果您需要列表,请使用
List<String> asList = Arrays.asList(strArray);
然后我必须使用两行:String [] strArray = new String [5]; Arrays.fill(strArray,&#34; foo&#34;);.有单线解决方案吗?
您可以使用Collections.nCopies(5, "foo")作为单行解决方案来获取列表:
List<String> strArray = Collections.nCopies(5, "foo");
或将其与toArray
合并以获得数组。
String[] strArray = Collections.nCopies(5, "foo").toArray(new String[5]);
答案 2 :(得分:2)
如果您的对象不是不可变的或不是参考透明的,则可以使用
Stream.generate(YourClass::new).limit(<count>)
并收集到列表
.collect(Collectors.toList())
或排列
.toArray(YourClass[]::new)
答案 3 :(得分:1)
可用于原始数组的版本(Java 8):
DoubleStream.generate(() -> 123.42).limit(777).toArray(); // returns array of 777 123.42 double vals
请注意,它返回double[]
,而不是Double[]
适用于IntegerStream,DoubleStream,LongStream
答案 4 :(得分:1)
使用IntStream
,您可以生成一个整数范围,将它们映射到所需的元素并将其作为列表收集。
List<String> list = IntStream.rangeClosed(0, 5)
.mapToObj(i -> "foo")
.collect(Collectors.toList());
或者,作为数组
String[] arr = IntStream.rangeClosed(0, 5)
.mapToObj(i -> "foo")
.toArray(String[]::new);