以下是我的代码:
Random rand = new Random();
String[] randomstrs = new String[3];
randomstrs = Arrays.stream(randomstrs)
.map(e -> Arrays.toString(rand.ints(3, 0, 5).toArray()).replaceAll("\\[|\\]", ""))
.collect(Collectors.toList())
.toArray(String[0]::new); // compile error
System.out.println(Arrays.toString(randomstrs));
我想知道如何在第.toArray(String[0]::new);
行使用方法参考。我知道我们可以new String[0]
,但我对使用方法参考更感兴趣。有什么指针吗?
答案 0 :(得分:2)
您可以删除collect()
并直接从Stream
生成数组:
randomstrs =
Arrays.stream(randomstrs)
.map(e -> Arrays.toString(rand.ints(3, 0, 5).toArray()).replaceAll("\\[|\\]", ""))
.toArray(String[]::new);
请注意,Stream::toArray
需要IntFunction<A[]>
,这意味着功能接口具有接受int
参数的方法并返回相关类型的数组。当您传递方法引用(例如String[]::new
)时,您不会传递方法的参数(在本例中是数组的长度)。
或者,如果要将Stream
收集到List
然后将其转换为数组,则应将数组实例传递给该方法,而不是函数接口。因此,您需要写:
randomstrs =
Arrays.stream(randomstrs)
.map(e -> Arrays.toString(rand.ints(3, 0, 5).toArray()).replaceAll("\\[|\\]", ""))
.collect (Collectors.toList())
.toArray(new String[0]);
答案 1 :(得分:0)
您的代码中的问题比您创建数组的方式更值得怀疑。您通过new String[3]
创建的第一个数组完全未使用。您将通过引用随后创建的新数组来覆盖其引用,因此您只能使用该数组来告知流进行三次迭代。另一种方法是使用IntStream.range
:
String[] randomstrs = IntStream.range(0, 3)
.mapToObj(e -> Arrays.toString(rand.ints(3, 0, 5).toArray()).replaceAll("\\[|\\]", ""))
.toArray(String[]::new); // compile error
System.out.println(Arrays.toString(randomstrs));
当然,如果你感兴趣的只是String
表示,那么首先你可以collect
将值String
改为Collector
。您也可以在嵌入式操作中使用相同的Arrays.toString
,而不是转换String resultString = IntStream.range(0, 3)
.mapToObj(e -> rand.ints(3, 0, 5).mapToObj(Integer::toString)
.collect(Collectors.joining(", ")))
.collect(Collectors.joining(", ", "[", "]"));
System.out.println(resultString);
的结果:
String resultString = IntStream.range(0, 3)
.flatMap(e -> rand.ints(3, 0, 5))
.mapToObj(Integer::toString)
.collect(Collectors.joining(", ", "[", "]"));
System.out.println(resultString);
但是,在这种情况下,您也可以使用
String resultString = rand.ints(3*3, 0, 5)
.mapToObj(Integer::toString)
.collect(Collectors.joining(", ", "[", "]"));
System.out.println(resultString);
甚至
ThreadLocalRandom
如果您真的想要数组,请将上面的第二个变体与``结合使用,但请注意,出于大多数实际目的,您可以只使用String[] randomstrs = IntStream.range(0, 3)
.mapToObj(e -> ThreadLocalRandom.current().ints(3, 0, 5)
.mapToObj(Integer::toString).collect(Collectors.joining(", ")))
.toArray(String[]::new);
:
while(adminUsing || (u.isAdmin() && userCount > 0) || (!u.isAdmin() && adminsWaiting > 0))